【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

相关推荐
涡能增压发动积6 小时前
同样的代码循环 10次正常 循环 100次就抛异常?自定义 Comparator 的 bug 让我丢尽颜面
后端
Wenweno0o6 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
swg3213216 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
tyung6 小时前
一个 main.go 搞定协作白板:你画一笔,全世界都看见
后端·go
gelald6 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川7 小时前
深入拆解 Java 内存模型:从原子性、可见性到有序性,彻底搞懂 happen-before 规则
java·后端
元宝骑士7 小时前
FIND_IN_SET使用指南:场景、优缺点与MySQL优化策略
后端·mysql
用户31952370347717 小时前
记一次 PostgreSQL WAL 日志撑爆磁盘的排查
后端
nghxni7 小时前
LightESB PlatformHttp v3.0.0:JSONPath 订单转换 HTTP 路由实战
后端
武子康8 小时前
大数据-263 实时数仓-Canal 增量订阅与消费原理:MySQL Binlog 数据同步实践
大数据·hadoop·后端