求助:WSGIRequest无session/user属性,Django中间件配置失效排查
排查Django中
WSGIRequest缺失session和user属性的问题 老哥,你碰到的这个问题大概率是中间件的配置顺序或者完整性出问题了——毕竟session和user这俩属性都是靠特定中间件给请求对象注入的,我给你整理几个实用的排查方向:
1. 先把中间件配置补全、查拼写
你贴的MIDDLEWARE_CLASSES最后截断了,首先得确认:
SessionMiddleware和AuthenticationMiddleware是不是完整配置了,有没有拼写错误(比如少打字母、大小写不对)- 要是你用的是Django 1.10及以后的版本,记得配置项已经改成
MIDDLEWARE了,别还在用旧的MIDDLEWARE_CLASSES,两者的执行逻辑有区别 - 旧版本项目里可能还需要
django.contrib.auth.middleware.SessionAuthenticationMiddleware,不过新版本已经把它整合到AuthenticationMiddleware里了,别重复加或者漏加
2. 中间件顺序绝对不能乱
Django的中间件是按顺序执行的,错了顺序直接导致依赖的属性加载不出来:
正确的核心中间件顺序得是这样(不管是旧版MIDDLEWARE_CLASSES还是新版MIDDLEWARE,这个核心顺序不能变):
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # 先初始化会话 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', # 依赖会话来加载用户 # 其他自定义或第三方中间件放后面 ]
重点:SessionMiddleware必须在AuthenticationMiddleware前面!后者得靠前者先把request.session初始化好,才能加载出request.user。
3. 排查自定义中间件是不是搞事情了
如果你的项目里有自己写的自定义中间件,得检查:
- 自定义中间件的
process_request方法是不是正确返回None或者HttpResponse?要是你在方法里错误地替换了request对象,或者修改后没正确传递,很可能把原有的session和user属性搞丢 - 自定义中间件的位置别放错,绝对不能放在
SessionMiddleware前面,不然它会在会话初始化之前就处理请求,自然拿不到这些属性
4. 试试最小化配置测试
要是还是找不到问题,可以先把中间件简化成最基础的必要配置,测试能不能正常拿到属性:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ]
如果这个配置下request.session和request.user正常了,再逐个把其他中间件加回去,就能排查出是哪个中间件在搞鬼了
内容的提问来源于stack exchange,提问作者cuijier
相关产品推荐
相关产品推荐

