使用【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」となります。

广告
将在 10 秒后关闭
bannerAds