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
相关产品推荐
相关产品推荐

