在Django中返回401 Unauthorized状态码可以通过以下方式实现:
401 Unauthorized是HTTP状态码,表示请求缺少有效的身份验证凭证。与403 Forbidden不同,401会提示客户端需要提供认证信息。
HttpResponse
from django.http import HttpResponse
def my_view(request):
response = HttpResponse("Unauthorized", status=401)
response['WWW-Authenticate'] = 'Basic realm="API"' # 可选:添加认证头
return response
JsonResponse
(返回JSON格式)from django.http import JsonResponse
def api_view(request):
return JsonResponse(
{"error": "Authentication required"},
status=401,
headers={'WWW-Authenticate': 'Bearer'}
)
from functools import wraps
from django.http import JsonResponse
def require_auth(view_func):
@wraps(view_func)
def wrapper(request, *args, **kwargs):
if not request.user.is_authenticated:
return JsonResponse({"error": "Unauthorized"}, status=401)
return view_func(request, *args, **kwargs)
return wrapper
@require_auth
def protected_view(request):
return JsonResponse({"data": "敏感数据"})
from rest_framework.response import Response
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def drf_view(request):
return Response({"data": "ok"})
# 未认证时会自动返回401
问题:返回401但浏览器不弹出认证对话框
原因:未设置WWW-Authenticate
头
解决:添加response['WWW-Authenticate'] = 'Basic realm="Secure Area"'
问题:DRF返回403而不是401
原因:默认配置为rest_framework.settings.api_settings.DEFAULT_AUTHENTICATION_CLASSES
解决:检查是否配置了SessionAuthentication
(会返回403),可改用TokenAuthentication
对于API开发,推荐使用DRF配合Token/Bearer认证,其标准中间件已处理了大部分401逻辑。传统Web应用可直接使用Django内置的@login_required
装饰器(默认返回302重定向,需设置LOGIN_URL
)。
没有搜到相关的文章