启用LoginRequiredMiddleware后DRF文件上传404问题求助
问题解决:LoginRequiredMiddleware与Django REST Framework配合使用
可以配合使用,但你的问题核心在于Django中间件的执行顺序优先于DRF的权限验证——请求还没进入DRF视图的权限检查环节,就被LoginRequiredMiddleware拦截并重定向到登录页,这也是你看到404的原因(API请求被重定向到网页登录路由,脚本调用无法处理该重定向,最终返回404)。
下面是几种可行的解决方案:
方案一:自定义中间件排除API路径
修改LoginRequiredMiddleware,让它跳过对指定API路由的检查:
- 在你的app下创建
middleware.py,编写自定义中间件:
from django.contrib.auth.middleware import LoginRequiredMiddleware class CustomLoginRequiredMiddleware(LoginRequiredMiddleware): def process_request(self, request): # 排除需要匿名访问的API路径,比如你的/upload/,或所有/api/开头的路由 excluded_paths = ['/upload/'] if any(request.path.startswith(path) for path in excluded_paths): return None # 其他路径继续执行原中间件的登录验证逻辑 return super().process_request(request)
- 在
settings.py中替换原中间件:
MIDDLEWARE = [ # ... 其他中间件 # 'django.contrib.auth.middleware.LoginRequiredMiddleware', # 注释掉原中间件 'your_app_name.middleware.CustomLoginRequiredMiddleware', # 替换为自定义中间件 ]
方案二:用DRF全局权限替代LoginRequiredMiddleware
既然同时存在网页和API场景,推荐用DRF的权限系统统一处理,避免中间件冲突:
- 在
settings.py中配置DRF全局认证和权限:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', # 如果使用token认证,可添加'rest_framework.authentication.TokenAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', # 全局默认要求登录 ] }
- 在需要匿名访问的API视图中单独设置权限:
from rest_framework.permissions import AllowAny class FileUploadView(APIView): permission_classes = [AllowAny] # 该视图允许匿名访问 def post(self, request, *args, **kwargs): # ... 你的原有代码
这种方式更符合DRF的设计逻辑,也彻底避免了Django中间件与DRF权限的冲突。
方案三:修复@login_not_required的使用方式
你之前直接装饰post方法无效,因为中间件检查的是整个视图的dispatch流程,需要装饰视图的dispatch方法:
from django.utils.decorators import method_decorator from django.contrib.auth.decorators import login_not_required from rest_framework.permissions import AllowAny @method_decorator(login_not_required, name='dispatch') class FileUploadView(APIView): permission_classes = [AllowAny] def post(self, request, *args, **kwargs): # ... 你的原有代码
这样中间件会识别到该视图不需要登录验证,不会触发重定向。
内容的提问来源于stack exchange,提问作者Naddeline
相关产品推荐
相关产品推荐

