Django提示'user' is not a registered namespace 本地正常生产接口报错
生产环境触发
'user' is not a registered namespace错误的解决方法 触发原因
你现在遇到的问题不是代码逻辑错了,是本地和生产环境的路由加载机制差异导致的:
- 你在主项目路由里引入user应用路由时,手动给
include()传了namespace="user"参数 - 同时在user应用自己的路由文件里,又写了
app_name = "user"做命名空间声明
本地开发服务器每次收到请求都会重新拉取全量路由配置,能自动把这两个重复的命名空间配置映射上,所以跑起来没任何问题;但生产环境用gunicorn/uwsgi启动时,路由配置会在服务启动时就一次性加载完缓存住,等接口文档发请求、视图里调用reverse()生成密码重置链接的时候,就容易因为缓存的路由映射缺了项,抛出'user' is not a registered namespace的错误。
具体修复操作
- 改主项目路由的引入写法,把
include()里手动写的namespace参数删掉
原来的写法:
改成:url(r'^api/user/', include('user.urls', namespace="user")),
你已经在user应用的路由文件里通过url(r'^api/user/', include('user.urls')),app_name = "user"声明了应用命名空间,Django会自动用这个值作为路由实例的默认命名空间,手动多传一次参数反而会打乱内部的映射关系。 - 核对生产环境的应用配置
检查生产的settings配置里,INSTALLED_APPS列表有没有把user应用加上,避免因为Python导入路径不对,生产环境根本没正常加载到user应用的路由文件。 - 重启所有生产服务进程
路由配置改完之后,一定要把跑着的gunicorn/uwsgi进程全部重启,把旧的缓存的路由配置清掉;如果项目用了Redis或者内存缓存存了路由解析结果,记得把对应缓存也清了,不然旧配置还会生效。 - 检查视图里的路由引用逻辑
确认密码重置视图里生成重置链接的时候,用的是正确的路由名(比如reverse('user:reset_password_request')),改完命名空间配置之后,这类引用就能被正常解析到了。
既然swagger页面能正常加载、能看到这个密码重置的接口,说明路由基础匹配是没问题的,问题只出在命名空间的动态解析环节,按上面几步调整完基本就能解决。
内容的提问来源于stack exchange,提问作者Furkan Cigerlioglu
相关产品推荐
相关产品推荐

