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

Django REST Framework登录接口POST请求返回403 Forbidden错误求助

解决Django REST Framework登录接口返回403 Forbidden的问题

核心原因分析

你的登录接口返回403,主要是两个关键问题:

  • Django REST Framework的APIView默认要求用户已认证,而登录接口需要允许匿名访问
  • 项目缺失必需的Django中间件,导致认证会话流程异常

具体修复步骤

1. 给登录/注册接口添加匿名访问权限

修改users/views.py,为LoginView和RegisterView添加permission_classes属性,允许未认证用户访问:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.permissions import AllowAny  # 导入AllowAny权限类
from .serializers import UserSerializer
from .models import User

class RegisterView(APIView):
    permission_classes = [AllowAny]  # 注册接口也需允许匿名访问
    def post(self, request):
        serializer = UserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

class LoginView(APIView):
    permission_classes = [AllowAny]  # 关键:允许匿名用户调用登录接口
    def post(self, request):
        email = request.data['email']
        password = request.data['password']

        user = User.objects.filter(email=email).first()

        if user is None:
            raise AuthenticationFailed('User not found!')

        if not user.check_password(password):
            raise AuthenticationFailed('Incorrect password!')

        return Response({
            'message': 'Success'
        })

2. 补全Django核心中间件

你的settings.py中MIDDLEWARE仅配置了跨域中间件,缺失Django默认的会话、认证等核心中间件,会导致认证流程异常。修改为:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

3. 可选:全局配置DRF默认权限

如果希望所有API默认允许匿名访问(后续再给需要认证的接口单独设置权限),可在settings.py中添加DRF全局配置:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}

验证修复

完成修改后重启Django服务,用Postman发送POST请求到/api/login:

  • 请求体使用JSON格式,传入注册时的email和password
  • 正常情况会返回{"message": "Success"};若邮箱或密码错误,会返回对应的AuthenticationFailed提示

内容的提问来源于stack exchange,提问作者Erling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:05:21