프로젝트

django 소셜로그인 시 url 패턴 오류

content0474 2025. 1. 9. 19:38

/api/v1/socials/kakao/login/ 까지는 접속 가능

이후 회원가입을 진행하려고 하면 아래와 같은 오류 발생

NoReverseMatch at /api/v1/socials/kakao/login/ Reverse for 'kakao_callback' not found. 'kakao_callback' is not a valid view function or pattern name.

카카오 디벨로퍼스 redirect URI는 제대로 등록된 상태

→ url 패턴 자체에 문제가 있을것 같다고 추정함

 

기존 코드

socials>urls.py

app_name = 'socials'

urlpatterns = [
    path('', include("allauth.urls")),
    path('check-user/', views.CheckUserView.as_view(), name='check_user'),
    path('social-link-or-create/', views.SocialLinkOrCreateView.as_view(), name='social_link_or_create'),
    path('link-social-account/', views.LinkSocialAccountView.as_view(), name='link_social_account'),
    path('linked-social-accounts/', views.GetLinkedSocialAccountsView.as_view(), name='linked_social_accounts'),
    path('default-social-accounts/', views.SetDefaultSocialProviderView.as_view(), name='default_social_provider'),
]

 

문제의 원인

1. URL Reverse와 네임스페이스 충돌

Django에서 app_name을 설정하면, URL 이름에 네임스페이스가 추가됨

ex) name='check_user' URL은 'socials:check_user'로 참조 하지만 기존의 코드나 설정(예: callback URL에서 reverse 함수나 URL 이름 참조)이 socials: 네임스페이스를 고려하지 않고 기존 이름(check_user)을 참조하고 있으면 오류가 발생

 

2. allauth의 기본 URL 네임스페이스

allauth.urls도 네임스페이스를 사용하지 않는 상태에서 URL을 정의하기 때문에, app_name을 추가하면 allauth에서 사용하는 콜백 URL도 네임스페이스 충돌로 영향을 받을 수 있음

 

3. 콜백 URL이 변경됨

app_name='socials'이 추가되면, 콜백 URL을 생성하거나 참조할 때 기존의 URL 이름이 socials: 네임스페이스를 요구하는데 allauth는 이 변경 사항을 알지 못하고 기존 URL 이름을 사용하기 때문에 오류가 발생

 

수정코드

urlpatterns = [
    path('', include("allauth.urls")),
    path('check-user/', views.CheckUserView.as_view(), name='check_user'),
    path('social-link-or-create/', views.SocialLinkOrCreateView.as_view(), name='social_link_or_create'),
    path('link-social-account/', views.LinkSocialAccountView.as_view(), name='link_social_account'),
    path('linked-social-accounts/', views.GetLinkedSocialAccountsView.as_view(), name='linked_social_accounts'),
    path('default-social-accounts/', views.SetDefaultSocialProviderView.as_view(), name='default_social_provider'),
]

 

앱네임 제거하여 네임스페이스가 영향을 받지 않게 함

 

교훈: 공식문서를 잘 보고 생각을 잘 하자