首页
学习
活动
专区
圈层
工具
发布

如何在Django中返回401 Unauthorized?

在Django中返回401 Unauthorized状态码可以通过以下方式实现:

基础概念

401 Unauthorized是HTTP状态码,表示请求缺少有效的身份验证凭证。与403 Forbidden不同,401会提示客户端需要提供认证信息。

实现方法

1. 使用HttpResponse

代码语言:txt
复制
from django.http import HttpResponse

def my_view(request):
    response = HttpResponse("Unauthorized", status=401)
    response['WWW-Authenticate'] = 'Basic realm="API"'  # 可选:添加认证头
    return response

2. 使用JsonResponse(返回JSON格式)

代码语言:txt
复制
from django.http import JsonResponse

def api_view(request):
    return JsonResponse(
        {"error": "Authentication required"},
        status=401,
        headers={'WWW-Authenticate': 'Bearer'}
    )

3. 使用装饰器(推荐复用)

代码语言:txt
复制
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": "敏感数据"})

4. 结合DRF(Django REST Framework)

代码语言:txt
复制
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

注意事项

  1. WWW-Authenticate头:RFC规范建议401响应应包含此头说明认证方式(如Basic/Bearer)
  2. 前后端分离场景:通常配合JSON响应和JWT等token方案
  3. 与403的区别
    • 401:未认证(可尝试重新认证)
    • 403:已认证但权限不足

常见问题解决

问题:返回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)。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券