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方法上:
- 修改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): # 保留你原有的视图逻辑不变
- 修改路由配置,移除路由层的中间件调用:
from .views import Profile app_name = 'account' urlpatterns =[ path('dashboard/pages-profile/<int:user_id>', Profile.as_view(), name='profile'), ]
内容的提问来源于stack exchange,提问作者Bibek Karna
相关产品推荐
相关产品推荐

