You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django-Rest-Framework中如何获取请求的REMOTE_ADDR?

获取Django HttpRequest中的REMOTE_ADDR(适配你的BileModelListAPIView场景)

嘿,这个需求其实很容易实现,我之前在写Django API视图的时候也经常这么做。咱们直接看怎么在你的代码里拿到客户端IP:

首先,你说的没错,Django的HttpRequest对象的META属性里确实存着REMOTE_ADDR,它就是客户端的IP地址。在你的get方法里直接读取就行,不过为了避免键不存在导致报错,建议用字典的get方法并设置默认值。

修改后的代码可以这样写:

class BileModelListAPIView(ListAPIView):
    serializer_class = BModelSerializer
    permission_classes = []
    queryset = BileModel.objects.all()
    
    def get(self, request):
        # 从META中获取客户端IP,默认值设为'unknown'防止键不存在
        remote_addr = request.META.get('REMOTE_ADDR', 'unknown')
        print(f"请求的客户端IP: {remote_addr}")
        return Response(data="ok", status=HTTP_200_OK)

额外提醒:部署在反向代理后的情况

如果你的API是部署在Nginx、Apache这类反向代理后面的,REMOTE_ADDR拿到的可能是代理服务器的IP,而不是真实的客户端IP。这时候你需要从HTTP_X_FORWARDED_FOR这个请求头里获取真实IP,不过要注意这个头可能包含多个IP(当经过多层代理时),所以需要处理一下:

可以先写一个辅助函数:

def get_real_client_ip(request):
    # 先尝试从X-Forwarded-For头获取
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        # 多个IP用逗号分隔,取第一个非空的真实IP
        ip = x_forwarded_for.split(',')[0].strip()
    else:
        # 没有代理的话直接取REMOTE_ADDR
        ip = request.META.get('REMOTE_ADDR', 'unknown')
    return ip

然后在你的视图里调用这个函数:

def get(self, request):
    real_ip = get_real_client_ip(request)
    print(f"真实客户端IP: {real_ip}")
    return Response(data="ok", status=HTTP_200_OK)

这样就能根据你的部署场景正确拿到客户端的IP地址啦~

内容的提问来源于stack exchange,提问作者qg_java_17137

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:59:02