Django REST Framework:自定义Header在客户端与单元测试中不一致
Django测试客户端传递自定义Header的解决方法
嘿,我刚好碰到过这个问题!Django测试客户端传自定义header的逻辑和requests库有点不一样,我来给你捋清楚怎么解决:
两种可行方案,看你Django版本选
方案1:直接用headers参数(Django 3.1及以上版本)
从Django 3.1开始,测试客户端的get()、post()等方法终于支持和requests一样的headers参数了,直接传字典就行,完全不用改header名称:
response = self.client.get(url, params=params, headers={'license': '12345'})
这种方式最直观,和你实际客户端的写法几乎一致,省心!
方案2:用HTTP_前缀的关键字参数(兼容所有Django版本)
如果你的Django版本比较旧(低于3.1),或者想保证兼容性,就得按照Django的规则来:把自定义header名称改成大写,再加上HTTP_前缀,作为关键字参数传给get()方法:
response = self.client.get(url, params=params, HTTP_LICENSE='12345')
Django测试客户端会自动把这个参数映射到request.META['HTTP_LICENSE'],和你权限类里的获取逻辑完美匹配。
完整测试用例示例
from django.test import TestCase class MyAPILicenseTest(TestCase): def test_valid_license_access(self): # 假设你的API接口地址是这个 api_url = '/api/your-endpoint/' test_params = {'category': 'books'} # 选一种你合适的方式传header # 方式1(Django3.1+): response = self.client.get(api_url, params=test_params, headers={'license': '12345'}) # 方式2(兼容所有版本): # response = self.client.get(api_url, params=test_params, HTTP_LICENSE='12345') # 验证请求成功 self.assertEqual(response.status_code, 200) # 这里可以加更多业务相关的断言,比如返回的数据是否正确
为啥之前会出问题?
简单说就是Django测试客户端的参数逻辑和requests不一样:requests会自动把自定义header转换成HTTP_前缀的形式放进请求头,但旧版Django测试客户端不会,必须你手动按它的规则传参数才行。
内容的提问来源于stack exchange,提问作者NoiK
相关产品推荐
相关产品推荐

