【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中:
from rest_framework import generics
from django.http import HttpRequestclass YourCreateAPIView(generics.CreateAPIView):def post(self, request, *args, **kwargs):# 获取客户端IP地址client_ip = self.get_client_ip(request)# 获取User-Agentuser_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()方法来获取这些信息。
from rest_framework import generics
from django.http import HttpRequestclass YourListAPIView(generics.ListAPIView):def get(self, request, *args, **kwargs):# 获取客户端IP地址client_ip = self.get_client_ip(request)# 获取User-Agentuser_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