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

使用django-pytest客户端发起带Basic Auth的GET请求返回401,方法是否有误?

排查视图测试中Basic Auth返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:11:25