如何在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
相关产品推荐
相关产品推荐

