使用【Django】REST框架将来自客户端的数据POST到项目中,并将客户端的IP地址存储到数据库中
首先
在使用Django的REST框架的项目中,经常会使用”uplink”来收集数据。由于我有机会进行”downlink”,也就是进行相反方向的通信,所以需要动态地知道”uplink”时是谁在进行数据的POST。因此,我决定将发送数据的网关或客户端的IP地址存储在数据库中,并在”downlink”时使用该IP地址。
得出結論
只需从Django项目的访问请求中包含的HTTP标头’ReMOTE_ADDR’获取客户端的IP地址即可。
请参考
使用Django获取客户端IP地址。
实施步骤
前提
(Paraphrased option in Chinese)
我写这篇文章的前提是有Python,Django和REST framework的经验。关于创建POST API的方法,我认为以下这篇文章很容易理解。
使用 Django Rest Framework 创建 RESTful API。
环境
CentOS Linux 发行版 7.9.2009 (核心)
Python 3.6.15
Django 3.2.0
djangorestframework 3.12.3
安装REST框架
$ pip install djangorestframework
在设置文件中添加REST框架。
假设配置文件夹的名称为config。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'rest_framework', # データPOSTAPI
…
]
创作一个用于上行链路的应用程序。
$ python manage.py startapp uplink
在配置文件中添加上行链路应用程序
假设设置目录名称为config
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # データPOSTAPI
+ 'uplink.apps.UplinkConfig', # アップリンク(データ収集)機能
…
]
定义 uplink 应用程序的 URL
urlpatterns = [
…
+ path('uplink/', include('uplink.urls')),
…
]
创建一个具有IP地址字段的模型,将其作为列。
from django.db import models
from django.utils import timezone
class PostData(models.Model):
"""
POSTされるデータのモデルクラス
create_at: データPOST時刻
client_ipaddr: データをPOSTしたクライアントのIPアドレス
"""
class Meta:
db_table="post_data"
verbose_name='PostData'
verbose_name_plural='PostData'
create_at = models.DateTimeField(
verbose_name='create_at',
blank=False,
null=False,
editable=False, #編集不可
default=timezone.now,
)
client_ipaddr = models.GenericIPAddressField(
verbose_name='Client IP address',
blank=False,
null=False,
default='0.0.0.0',
editable=False, #編集不可
)
在管理员处添加模型。
from django.contrib import admin
from .models import PostData
@admin.register(PostData)
class PostDataAdmin(admin.ModelAdmin):
list_display = (
'create_at',
'client_ipaddr',
)
定义URL
from django.urls import path
from . import views
app_name = 'uplink'
urlpatterns = [
path('data_post/', views.CreateData.as_view(), name='data_post'),
]
9. 定义一个序列化器。
在定义此序列化器时,如果不定义client_ipaddr = serializers.IPAddressField(),将无法正常工作。
"""
データをPOSTするときのシリアライザ
"""
from rest_framework import serializers
from .models import PostData
class PostDataSerializer(serializers.ModelSerializer):
# IPアドレス型のデータとして用意しておく
client_ipaddr = serializers.IPAddressField()
class Meta:
model = PostData
fields = (
'__all__'
)
read_only_fields = ('create_at', 'client_ipaddr', )
定义视图10。
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from django.utils import timezone
from .serializer import PostDataSerializer
class CreateData(APIView):
"""
ゲートウェイからPOSTされたデータをデータベースに格納する
"""
parser_classes = (MultiPartParser, FormParser, )
def post(self, request, format=None):
# POSTデータのペイロードをシリアライズするために整形
data = {}
data['create_at'] = timezone.localtime(timezone.now())
client_ipaddr = request.META.get('REMOTE_ADDR')
data['client_ipaddr'] = client_ipaddr
# シリアライザにかける
serializer = PostDataSerializer(data=data)
# シラアライズの成否で処理を変更
if serializer.is_valid():
serializer.save()
print('●Valied data post.')
print(serializer.validated_data)
return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
# エラーを吐いたら詳細を見せてもらう
print('●Data post is invalied.')
print(serializer.errors)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
11. 数据库迁移
$ python manage.py makemigrations
$ python manage.py migrate
总结
我写了很多内容,但对于熟练使用REST框架的人来说,只需要记住”结论”的内容和定义序列化器时的注意事项即可。使用Django进行下行链接也会受到一定的限制,但我会随时进行补充。
如果您能提供任何疑问或修正之处,我会非常高兴。
继续
请务必查看我在《Django》REST框架中关于在项目中将客户端的IP地址存储到数据库中的文章【Django】REST frameworkでプロジェクトにデータPOSTしてくるクライアントのIPアドレスをDBに格納する(続)中,我已经写明了在完成本文中的步骤后如何进行确认的方法。
请查询
「アップリンク」とは、IT用語辞典e-Wordsによれば、「上りリンク」と翻訳され、Djangoを使用してクライアントのIPアドレスを取得する方法については「シリアライザ内のIPAddressField」、Django Rest Frameworkを使用してRESTfulなAPIを作成する方法については「Django Rest Frameworkで作成するRESTfulなAPI」となります。