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

Django自定义auth中间件应用于带user_id的URL时报未知参数错误求助

报错根因

你编写的auth_middleware是符合Django全局中间件规范的写法,原本设计为在settings中配置全局生效。当你直接将其作为装饰器套在路由的视图上调用时,URL路径捕获的user_id参数会被传递给内层的middleware函数,但你定义的middleware仅接收request一个入参,参数数量不匹配就触发了该报错。

解决方案

方案1:修改中间件适配单视图装饰场景(推荐)

给middleware函数加上可变参数接收路径参数,并透传给后续的视图即可,修改后的中间件代码如下:

def auth_middleware(get_response):
    # 新增*args、**kwargs接收URL传递的路径参数
    def middleware(request, *args, **kwargs):
        return_url = request.META['PATH_INFO']
        if not request.session.get('user_id'):
            return HttpResponseRedirect(f'{reverse("account:login")}?return_url={return_url}')
        # 将路径参数透传给实际的视图函数
        response = get_response(request, *args, **kwargs)
        return response
    return middleware

改完后不需要调整原有路由配置,直接运行即可。

方案2:在视图类上挂载装饰器

如果你不想修改中间件源码,可以使用Django提供的method_decorator把中间件装饰在视图类的dispatch方法上:

  1. 修改Profile视图类代码:
from django.utils.decorators import method_decorator
from employer.middlewares.auth import auth_middleware

# 给类视图的dispatch方法加上中间件装饰
@method_decorator(auth_middleware, name='dispatch')
class Profile(View):
    # 保留你原有的视图逻辑不变
  1. 修改路由配置,移除路由层的中间件调用:
from .views import Profile

app_name = 'account'

urlpatterns =[
    path('dashboard/pages-profile/<int:user_id>', Profile.as_view(), name='profile'),
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:15:08