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

启用LoginRequiredMiddleware后DRF文件上传404问题求助

问题解决:LoginRequiredMiddleware与Django REST Framework配合使用

可以配合使用,但你的问题核心在于Django中间件的执行顺序优先于DRF的权限验证——请求还没进入DRF视图的权限检查环节,就被LoginRequiredMiddleware拦截并重定向到登录页,这也是你看到404的原因(API请求被重定向到网页登录路由,脚本调用无法处理该重定向,最终返回404)。

下面是几种可行的解决方案:

方案一:自定义中间件排除API路径

修改LoginRequiredMiddleware,让它跳过对指定API路由的检查:

  1. 在你的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)
  1. 在settings.py中替换原中间件:
MIDDLEWARE = [
    # ... 其他中间件
    # 'django.contrib.auth.middleware.LoginRequiredMiddleware',  # 注释掉原中间件
    'your_app_name.middleware.CustomLoginRequiredMiddleware',  # 替换为自定义中间件
]

方案二:用DRF全局权限替代LoginRequiredMiddleware

既然同时存在网页和API场景,推荐用DRF的权限系统统一处理,避免中间件冲突:

  1. 在settings.py中配置DRF全局认证和权限:
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        # 如果使用token认证,可添加'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',  # 全局默认要求登录
    ]
}
  1. 在需要匿名访问的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:03:15