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

如何在Django RequestFactory请求的META中添加HTTP_X_FORWARDED_FOR?

为request对象添加HTTP_X_FORWARDED_FOR的测试方案

嘿,这事儿很简单~Django的RequestFactory生成的request对象,它的META属性就是个普通字典,你有两种轻松的方式来添加HTTP_X_FORWARDED_FOR字段:

方法一:创建request时直接传入META参数

调用factory.get()的时候,直接把自定义的请求头通过关键字参数传进去就行(注意Django会自动把参数名转换成大写、加HTTP_前缀的格式,不过你直接写HTTP_X_FORWARDED_FOR也完全没问题)。示例代码如下:

def test_get_client_ip_with_x_forwarded_for(self):
    """Test get_client_ip when HTTP_X_FORWARDED_FOR exists."""
    # 模拟单个IP的代理场景
    request = self.factory.get('/home', HTTP_X_FORWARDED_FOR='192.168.1.100')
    ip = get_client_ip(request)
    self.assertEqual(ip, '192.168.1.100')

    # 模拟多层代理的场景(多个IP用逗号分隔)
    request_multi_proxy = self.factory.get('/home', HTTP_X_FORWARDED_FOR='10.0.0.5, 192.168.1.100, 172.16.0.1')
    ip_multi = get_client_ip(request_multi_proxy)
    self.assertEqual(ip_multi, '10.0.0.5')  # 你的代码会取第一个IP,所以断言第一个值

方法二:创建request后修改META字典

如果已经生成了request对象,直接修改它的META字典也是可行的,适合需要在同一个request对象上测试多种场景的情况:

def test_get_client_ip_with_x_forwarded_for(self):
    """Test get_client_ip when HTTP_X_FORWARDED_FOR exists."""
    request = self.factory.get('/home')
    
    # 先测试单个IP的情况
    request.META['HTTP_X_FORWARDED_FOR'] = '192.168.1.100'
    ip = get_client_ip(request)
    self.assertEqual(ip, '192.168.1.100')

    # 再测试多个IP的情况
    request.META['HTTP_X_FORWARDED_FOR'] = '10.0.0.5, 192.168.1.100'
    ip_multi = get_client_ip(request)
    self.assertEqual(ip_multi, '10.0.0.5')

另外,建议补充一个边界场景测试——当HTTP_X_FORWARDED_FOR为空字符串时的情况,确保代码不会出异常:

def test_get_client_ip_empty_x_forwarded_for(self):
    """Test get_client_ip when HTTP_X_FORWARDED_FOR is empty."""
    request = self.factory.get('/home', HTTP_X_FORWARDED_FOR='')
    ip = get_client_ip(request)
    self.assertEqual(ip, '')  # 此时split(',')[0]是空字符串,按代码逻辑断言即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:53:49