集成Django OAuth Toolkit URL时遇命名空间未指定app_name报错
解决Django include()指定namespace时缺少app_name的报错
这个报错我太熟了!问题出在Django对URL命名空间的严格要求上——从Django 1.9开始,当你在include()里指定namespace参数时,必须同时提供对应的app_name,要么在被包含的URL配置模块里定义app_name变量,要么在include()里传入一个包含URL模式列表和app_name的元组。
针对你手动引入django-oauth-toolkit URL来阻止用户创建应用的场景,给你两种可行的解决方案:
方案1:创建独立的OAuth URL配置文件(推荐)
这种方式更清晰,也符合Django的最佳实践:
- 在你的项目目录下新建一个
oauth_urls.py文件,写入你需要保留的OAuth视图(排除应用创建/管理相关的视图),同时必须设置app_name为oauth2_provider(因为oauth-toolkit的内部视图依赖这个命名空间):
from django.urls import path from oauth2_provider.views import ( AuthorizationView, TokenView, RevokeTokenView, IntrospectTokenView, # 这里不要添加ApplicationList、ApplicationCreate、ApplicationUpdate等视图 ) app_name = 'oauth2_provider' urlpatterns = [ path('authorize/', AuthorizationView.as_view(), name='authorize'), path('token/', TokenView.as_view(), name='token'), path('revoke_token/', RevokeTokenView.as_view(), name='revoke-token'), path('introspect/', IntrospectTokenView.as_view(), name='introspect'), # 按需添加你需要的其他OAuth视图 ]
- 在根
urls.py里引入这个配置文件,并指定命名空间:
from django.urls import path, include urlpatterns = [ # 你的其他URL配置... path('oauth/', include('your_project_name.oauth_urls', namespace='oauth2_provider')), ]
方案2:直接在根urls.py中使用元组传递
如果不想新建文件,可以直接在根urls.py里把URL模式列表和app_name组成元组传给include():
from django.urls import path, include from oauth2_provider.views import ( AuthorizationView, TokenView, RevokeTokenView, IntrospectTokenView, ) # 定义需要保留的OAuth URL模式 oauth_urlpatterns = [ path('authorize/', AuthorizationView.as_view(), name='authorize'), path('token/', TokenView.as_view(), name='token'), path('revoke_token/', RevokeTokenView.as_view(), name='revoke-token'), path('introspect/', IntrospectTokenView.as_view(), name='introspect'), ] urlpatterns = [ # 你的其他URL配置... # 用元组(URL列表, app_name)的方式传入include,同时指定namespace path('oauth/', include((oauth_urlpatterns, 'oauth2_provider'), namespace='oauth2_provider')), ]
为什么这样能解决问题?
当你直接include官方的oauth2_provider.urls时,这个模块内部已经定义了app_name='oauth2_provider',所以Django能自动关联命名空间。但现在你手动拆分了URL,就必须自己显式指定app_name,让Django知道这些URL属于oauth2_provider这个应用的命名空间,否则就会抛出你遇到的那个错误。
内容的提问来源于stack exchange,提问作者Moritz Hohmeier
相关产品推荐
相关产品推荐

