如何使用Django调用带Basic Auth的Django REST Framework API
错误原因
你的API启用了Basic Authentication,但调用时的requests.get请求未携带任何认证凭据,服务器无法验证身份,因此返回"Unauthorized"错误。
修复代码:添加Basic认证凭据
在请求中加入认证信息,有两种可行方式:
方式1:通过auth参数传入认证信息(推荐)
使用requests库的HTTPBasicAuth类,传入合法的API认证用户名和密码:
from requests.auth import HTTPBasicAuth def display_clerk_view(request): # 替换为你的实际认证用户名和密码 auth_username = "your_valid_username" auth_password = "your_valid_password" displaytable = requests.get( 'http://127.0.0.1:8000/Clerk/', auth=HTTPBasicAuth(auth_username, auth_password) ) # 先检查响应状态,避免解析失败 if displaytable.status_code == 200: jsonobj = displaytable.json() return render(request, 'clearance/clerk_view.html', {"ClerkClearanceItems": jsonobj}) else: # 处理认证失败或其他请求错误 return render(request, 'clearance/error.html', {"message": "认证失败或请求异常"})
方式2:URL嵌入凭据(不推荐,安全性低)
这种方式会将密码暴露在URL中,仅用于测试场景:
displaytable = requests.get('http://your_username:your_password@127.0.0.1:8000/Clerk/')
Basic Authentication 核心机制
Basic Auth是一种简单的HTTP认证协议,流程如下:
- 客户端向需要认证的API端点发送请求
- 服务器返回401响应,附带
WWW-Authenticate: Basic realm="xxx"响应头,提示需要认证 - 客户端将
用户名:密码拼接后做Base64编码,放在请求头Authorization: Basic <Base64编码字符串>中重新发送请求 - 服务器解码该字符串,验证用户名密码有效性,通过则返回请求资源
Django REST Framework的BasicAuth组件会自动处理上述流程,你只需确保请求携带正确的认证信息即可。
关于后续接入Google身份提供商(django-allauth)
当你通过django-allauth接入Google OAuth2后,建议将API认证方式切换为Token或OAuth2 Authentication:
- 用户通过Google登录后,后端生成合法的认证令牌(如JWT)
- 客户端调用API时,在请求头中携带
Authorization: Bearer <令牌> - DRF验证令牌有效性后确认用户身份
这种方式比Basic Auth更安全,避免明文传输用户名密码,适合生产环境使用。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

