使用django-pytest客户端发起带Basic Auth的GET请求返回401,方法是否有误?
你的代码思路没问题,但持续收到401大概率是凭证处理或服务端配置的细节没到位,我帮你梳理几个核心排查方向:
1. 先确认Base64编码是否正确
手动编码偶尔会出现隐性错误,你可以先打印生成的staff_credentials值,验证是否符合预期。比如针对staff_user:staff_password,正确的编码结果应该是c3RhZmZfdXNlcjpzdGFmZl9wYXNzd29yZA==。
你可以用这段代码快速验证:
import base64 print(base64.b64encode(b'staff_user:staff_password').decode('utf-8'))
对比你代码里生成的结果,确保编码没有出错。
2. 重点检查测试用户的密码存储方式
如果是Django这类框架,用户密码默认是哈希存储的,这是最容易踩的坑!你需要确保测试用的staff_user确实是用明文密码staff_password设置的:
# 创建测试用户时正确设置密码 from django.contrib.auth.models import User staff_user = User.objects.create_user(username='staff_user', password='staff_password') # 如果是已存在的用户,需要更新密码 staff_user.set_password('staff_password') staff_user.save()
如果你的测试用户密码不是通过上述方式设置(比如直接赋值password字段),服务端解码后得到的明文密码会和存储的哈希值不匹配,直接返回401。
3. 验证请求头格式是否严谨
虽然HTTP头不区分大小写,但最好严格写成Authorization;另外要确保Basic和编码字符串之间有一个空格,你的代码里f"Basic {staff_credentials}"是正确的,不过可以再检查有没有拼写错误。
4. 排查测试客户端或服务端中间件干扰
如果你用的是框架自带的测试客户端(比如Django Client),可以试试用requests库直接发请求,区分是客户端配置问题还是服务端逻辑问题:
import requests import base64 url = "http://localhost:8000/your-target-url/" staff_credentials = base64.b64encode(b'staff_user:staff_password').decode('utf-8') response = requests.get(url, headers={"Authorization": f"Basic {staff_credentials}"}) print(response.status_code, response.text)
如果这个请求返回200,那问题大概率在测试客户端的配置上;如果还是401,就去服务端找认证逻辑的问题。
5. 查看服务端日志定位原因
开启服务端的DEBUG日志,比如Django可以配置日志输出认证相关信息:
# settings.py 中添加日志配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': {'console': {'class': 'logging.StreamHandler'}}, 'loggers': { 'django.contrib.auth': { 'handlers': ['console'], 'level': 'DEBUG', }, }, }
运行测试后看控制台日志,能直接看到认证失败的具体原因,比如用户不存在、密码不匹配等。
内容的提问来源于stack exchange,提问作者vasco_t

