【django framework】ModelSerializer+GenericAPIView,如何获取HTTP请求头中的信息(远程IP、UA等)

【django framework】ModelSerializer+GenericAPIView,如何获取HTTP请求头中的信息(远程IP、UA等)

某些时候,我们不得不获取调用当前接口的客户端IP、UA等信息,如果是第一次用Django Restframework,可能会有点懵逼,那么如何generics的时候获取请求头中的信息呢,让我们来看看吧。



1 创建接口,继承generics.CreateAPIView时获取

当继承generics.CreateAPIView时,根据RESTful接口标准,意味着我们要用它来创建一条记录,此时我们可以使用以下代码来获取请求头信息。

要在Django的generics.CreateAPIView中获取客户端的IP地址和User-Agent等信息,可以使用django的HttpRequest对象。HttpRequest对象包含了关于当前请求的所有信息,包括客户端IP地址和User-Agent等。

views.py中:

python 复制代码
from rest_framework import generics
from django.http import HttpRequest

class YourCreateAPIView(generics.CreateAPIView):
    def post(self, request, *args, **kwargs):
        # 获取客户端IP地址
        client_ip = self.get_client_ip(request)

        # 获取User-Agent
        user_agent = request.META.get('HTTP_USER_AGENT')

        # 现在可以使用client_ip和user_agent了
        # 具体处理逻辑...

        return super().post(request, *args, **kwargs)

    def get_client_ip(self, request: HttpRequest) -> str:
        """
        获取客户端IP地址的方法
        // 注意:也可以在此获取其他的参数,然后一并返回
        """
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            # 如果使用了代理服务器,X-Forwarded-For会有多个IP,取第一个
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip

2 读取接口,generics.ListAPIView时获取

在ListAPIView中获取客户端的IP地址和User-Agent等信息的方法与CreateAPIView中类似。你可以通过重写get()方法或者list()方法来获取这些信息。

python 复制代码
from rest_framework import generics
from django.http import HttpRequest

class YourListAPIView(generics.ListAPIView):
    def get(self, request, *args, **kwargs):
        # 获取客户端IP地址
        client_ip = self.get_client_ip(request)

        # 获取User-Agent
        user_agent = request.META.get('HTTP_USER_AGENT')

        # 现在可以使用client_ip和user_agent了
        # 具体处理逻辑...

        return super().get(request, *args, **kwargs)

    def get_client_ip(self, request: HttpRequest) -> str:
        """
        获取客户端IP地址的方法
        // 注意:也可以在此获取其他的参数,然后一并返回
        """
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            # 如果使用了代理服务器,X-Forwarded-For会有多个IP,取第一个
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip

相关推荐
码兄科技8 小时前
实战:基于Spring Boot + UniApp的地理信息小程序开发
spring boot·后端·uni-app
腾讯云云开发9 小时前
腾讯云 CloudBase 登上 WAIC:我们为 Agent 重新设计了云的生产线
后端
星栈10 小时前
从装一堆工具到看懂 Node 工程化思维:我的项目复盘记录
后端·node.js
65岁退休Coder10 小时前
LangChain v1.3.4 笔记 - 05 Agent 上下文记忆
后端
颜酱10 小时前
04 | 召回前置准备:搭好召回所需的四个数据库
前端·人工智能·后端
JaneConan10 小时前
鸿蒙 韶非 UI 系列:能力调用 startAbilityForResult,跳能力拿回参,鸿蒙能力路由入门
后端·harmonyos
晴空了无痕10 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
用户83562907805110 小时前
如何使用 Python 在 Excel 中添加、编辑和删除超链接
后端·python
花椒技术11 小时前
原本要 2 天的服务端冒烟前置审查,为什么 3 分半就能出报告?|QA 质量交付实践(三)
后端·ai编程·测试
达达尼昂11 小时前
AI 编程的工程化实践:Flutter AI Harness 的设计与落地
人工智能·后端·全栈