【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

相关推荐
Moment3 分钟前
太好了!NestJS 12 大版本转向 ESM,新项目默认构建换 Rspack
前端·javascript·后端
名字还没想好☜17 分钟前
Go 用 -race 抓数据竞争:一个偶发崩溃的排查、原理与修复
开发语言·后端·golang·go
学习星球31 分钟前
CodeWhale 深度剖析:从 DeepSeek-TUI 到 40.9K Star 的 Rust 终端编程 Agent
开发语言·后端·rust
Rain的Java大神之路37 分钟前
高并发下的热点账户余额扣减:Redis+Lua脚本实现无锁记账
java·spring boot·redis·后端·spring cloud·缓存·lua
kgduu43 分钟前
moduo之http
后端
烂蜻蜓4 小时前
Flask入门教程(二十六):Session API——用户会话状态管理
后端·python·flask
郑州光合科技余经理6 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
朦胧之12 小时前
PostgreSQL 数据库笔记
人工智能·后端
IT_陈寒14 小时前
Redis缓存雪崩把我坑惨了,这次长记性了
前端·人工智能·后端
LucianaiB14 小时前
用 WorkBuddy 研究腾讯、阿里和 DeepSeek,我没敢直接说「AI 很赚钱」
后端