如何在Django测试中读取请求头?APIClient遇401授权问题
Django APIClient 设置请求头后返回401未授权问题
在使用Django的APIClient进行测试时,设置请求头后接口返回401未授权状态,已排查数小时仍无法解决,请求帮助。
代码示例
self.client = APIClient() self.jwt = response.json()["access"] self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.jwt) self.client.headers.update({'Origin': 'https://travelingapps.com.co'})
返回结果
('status_code', 401), ('content_type', 'application/json'), ('content', 'UNAUTHORIZED')
排查方向
- 验证JWT令牌有效性:打印
self.jwt确认获取到的是有效令牌,或通过JWT解码工具检查令牌的过期时间、签名是否符合后端要求。 - 直接在请求时传递请求头:APIClient的
credentials()方法有时可能被其他逻辑覆盖,尝试在发起请求时通过headers参数直接指定所有需要的头信息:response = self.client.get( '/目标接口路径/', headers={ 'Authorization': f'Bearer {self.jwt}', 'Origin': 'https://travelingapps.com.co' } ) - 检查Origin头的合法性:确认后端是否对Origin头做了白名单校验,确保设置的
https://travelingapps.com.co在后端允许的列表中,注意域名的大小写、是否带斜杠等细节。 - 排查中间件干扰:如果项目中有自定义认证中间件或CSRF中间件,尝试临时禁用相关中间件测试,确认是否是中间件修改了请求头或拦截了请求。
- 打印请求头确认:在测试中输出实际发送的请求头,确认Authorization和Origin是否被正确携带:
# 用RequestFactory模拟请求,查看头信息 from django.test.client import RequestFactory factory = RequestFactory() test_request = factory.get( '/目标接口路径/', headers={ 'Authorization': f'Bearer {self.jwt}', 'Origin': 'https://travelingapps.com.co' } ) print(test_request.headers)
内容的提问来源于stack exchange,提问作者nikolas cantillo
相关产品推荐
相关产品推荐

