본문 바로가기
Django

Django 어플리케이션마다 URL분리하기

by nyanguk 2021. 1. 25.

구구절절 한것 말고 핵심을 요약하자면

  • url의 개수가 많아질수록  프로젝트 urls.py에 담기엔 양도 많고 헷갈리므로 각 app에 urls.py를 만든다.
이때 하나에 몰아 넣는다는 프로젝트 urls.py는 내가 처음으로 만들었던 프로젝트안의 urls.py이다.
https://nyanguk.tistory.com/9 을 참고해서 보면 mysite라는 이름으로 만들었다. 즉 mysite 디렉토리안의 urls.py이다.
  • 프로젝트의 urls.py와 app의 urls.py를 연결하기 위해 include를 사용해 프로젝트 urls.py에게 안내원 역할을 시킨다.

이게 끝이다! 이제 상세하게 파고들어 본다.

 

프로젝트 urls.py의 역할

프로젝트 안에서 생성된 모든 view들에게 url을 할당해주고 요청이 발생하면 구현한 함수대로 코드가 실행 될 수 있게 한다. 즉, 어플리케이션으로 구현하고자 할때도 프로젝트 urls.py에 url을 알려줘야한다.

이런 경우를 한가지 예를 들어 이해해보자 우리가 한 건물안에서 a부서를 찾아야 할때면 1층 엘리베이터 옆에 있는 각 층수별 부서 표를 확인한다. 각 층마다 무슨 부서가 있는지 알려주는 것이 바로 프로젝트 urls.py의 역할이다.

그러나 각 층마다 부서의 수가 많아지거나 증축을 통해 층이 더 높아지게 된다면 엘리베이터 사이의 벽면에 모든 층수별 부서를 기록해 둘 수 없을뿐더러 찾기가 매우 힘들것이다. 모든 부서를 기록해야한다면 각 부서의 특성을 기준으로 그룹화하여 나눈다면 더욱찾기 쉬워질 것이다. 그룹화한 이름의 표를 제공하고 각 그룹안의 부서를 나타내는 표로 안내한다면 헷갈리지 않고 목적지에 잘 도착 할 수 있게된다. 

이러한 역할(그룹화한 이름의 표)을 수행하기 위해 우리는 include를 사용한다.

 

각  어플리케이션에 url을 나누기

프로젝트 urls.py는 위의 예에서 각 부서의 특성을 기준으로 그룹화한 이름을 제공하기로했다. 이 그룹화한 이름이 바로 어플리케이션의 이름이 되며 어플리케이션마다 할당된 url을 각 어플리케이션안의 urls.py로 나눈다.

 

아래 코드는 나의 프로젝트 urls.py 이다. 아래 코드에서 blog나 accounts 어플리케이션이 존재해 각 뷰에 어플리케이션 이름을 넣어서 url을 할당했다. 

# .../mysite/urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    path(r'blog/', blog.views.post_list, name='post_list'),
    path(r'blog/post/<int:pk>/', blog.views.post_detail, name='post_detail'),
    path(r'blog/post/new', blog.views.post_new, name='post_new'),
    path(r'blog/^drafts/$', blog.views.post_draft_list, name='post_draft_list'),
    path(r'accounts/signup',accounts.views.signup,name='signup' ),
    path(r'accounts/login',accounts.views.login,name='login' ),
    path(r'accounts/logout',accounts.views.logout,name ='logout' ),
]

이제 blog,accounts 라는 이름의 어플리케이션에 url을 분리해보자!

# blog/urls.py
from django.urls import path
from . import views
urlpatterns = [
    path(r'', views.post_list, name='post_list'),
    path(r'post/<int:pk>/', views.post_detail, name='post_detail'),
    path(r'post/new', views.post_new, name='post_new'),
    path(r'^drafts/$', views.post_draft_list, name='post_draft_list'),
]
# accounts/urls.py
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path(r'signup',views.signup,name='signup' ),
    path(r'login',views.login,name='login' ),
    path(r'logout',views.logout,name ='logout' ),
]

동일하게 묶일 수 있는 blog와 accounts가 사라졌음을 확인 할수 있다.

 

 

그렇다면 프로젝트의 urls.py는 어떻게 바뀌어야 할까?

include를 사용하여 위의 예시에서 이야기 했던 그룹화한 이름의 표를 만든다. (사용하기 위해 include를 import 한다.)

url('A',include('B.urls')) 는 ~A 인 url들은 B 어플리케이션 안에 있는 urls.py를 참고하라는 말과 같다.

url이 ~~~~/blog 라면 blog안에 있는 urls.py에서 더 자세하게 찾아달라는 말이다.

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^blog/', include('blog.urls')),
    url(r'^accounts/', include('accounts.urls')),
]

 

 

이렇게 해서 url을 어플리케이션에 맞게 효율적으로 관리할 수 있게된다. 이러한 분리는 프로젝트  urls.py에 몰아 넣을때  각 어플리케이션의 뷰를 import 하지 않아도 된다는 장점이 있다.

'Django' 카테고리의 다른 글

Django login,logout 세부구현  (0) 2021.01.27
Django signup 세부구현  (0) 2021.01.26
Django signup/login/logout 구현  (0) 2021.01.24
Django 임시 저장한 글 불러오기  (0) 2021.01.23
Django 임시저장 및 발행, 삭제  (0) 2021.01.22