DRF Social OAuth2访问Facebook登录URL时命名空间匹配错误问题
问题描述
实现drf social oauth2功能时,访问URL localhost:8000/auth/login/facebook/ 出现'drf' is not a registered namespace及No ReverseMatch错误;将namespace改为social后,又出现'social' is not a registered namespace错误。
用户配置代码
URLPatterns
urlpatterns = [ path("admin/", admin.site.urls), path('auth/', include('drf_social_oauth2.urls', namespace='social')), path('api/', include("users.urls")), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Installed Apps
INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", # rest "rest_framework", "corsheaders", "rest_framework_simplejwt", # Oauth "oauth2_provider", "social_django", "drf_social_oauth2", # apps "accounts", "inventory", "cart", "orders", "users", ]
解决办法
核心原因
drf_social_oauth2的内置urls已预设命名空间'drf',手动指定不一致的命名空间会导致路由反向解析失败;若不指定命名空间,Django会自动使用第三方库内置的命名空间完成匹配。
方案一:移除手动指定的namespace
修改URL配置,去掉include中的namespace参数:
urlpatterns = [ path("admin/", admin.site.urls), path('auth/', include('drf_social_oauth2.urls')), path('api/', include("users.urls")), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
方案二:使用与库内置一致的namespace
如果必须显式指定命名空间,要和drf_social_oauth2内置的命名空间'drf'保持一致:
urlpatterns = [ path("admin/", admin.site.urls), path('auth/', include('drf_social_oauth2.urls', namespace='drf')), path('api/', include("users.urls")), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
额外检查
- 确保
social_django和oauth2_provider已正确添加到INSTALLED_APPS(当前配置已满足) - 清除Django缓存,避免旧路由配置残留
内容的提问来源于stack exchange,提问作者Sins97
相关产品推荐
相关产品推荐

