3. Using django(=topics)
3.3.1 URL dispatcher
11. Including other URLconfs
어떤 지점에서든지, 우리의 urlpatterns는 다른 URL관리자(URLconf = urls.py)의 모듈을 가져다 쓸(include) 수 있습니다. 다른 URL관리자에게 속한 URL들에 뿌리를 뻗어놓는 느낌이죠.
예를 들어, 아래 예시에는 Django website 자체에서 발췌한 URL관리자가 하나 있습니다. 이 관리자는 다른 URL관리자를 몇 몇 포함하고 있습니다.
from django.conf.urls import include, url
urlpatterns = [
#...생략...
url(r'^community/', include('django_websiteaggregator.urls')),
url(r'^contact/', include('django_website.contact.urls')),
#...생략...
]
위 예제에서 정규표현식(regex = regular expressions)이 $를 가지고 있지 않다는 점을 주목하세요. ($는 정규표현식에서 문자열의 끝을 의미합니다.) $가 없는 대신, 슬래시 /
를 이용해 include를 사용하고 있습니다. 장고가 include()를 만나면, 그 시점까지 연결되어 있던 URL이 무엇이든 간에 잘라버리고, 전체 프로세싱을 남아있는(아직 매칭되지 않은) URL을 include된 URL관리자(URLcond=urls.py)로 옮겨가 버립니다.
include를 사용하는 또다른 방식은 추가적인 URL pattern들을 포함하는 것입니다. url() 인스턴스의 리스트를 이용하는 방식이죠. 아래와 같은 예를 들 수 있습니다.
from django.conf.urls import include, url
from apps.main import views as main_views
# apps.main에서 불러온 views는 main_views라고 부른다.
from credit import views as credit_views
# credit에서 불러온 views는 credit_views라고 부른다.
extra_patterns = [
url(r'^reports/$', credit_views.report),
url(r'^reports/(?P<id>[0-9]+)/$', credit_views.report),
url(r'^charge/$', credit_views.charge),
]
urlpatterns = [
url(r'^$', main_views.homepage),
url(r'^help/', include('apps.help.urls')),
url(r'^credit/', include(extra_patterns)),
]
위 예의 경우, /credit/reports/ 라는 URL이 요청되면, 이 요청은 credit_views.report()에 의해 처리될 것입니다.
(그림 필요)
이런 방식을 사용하면, 아래의 예처럼 똑같은 접두사를 반복적으로 사용하지 않아도 됩니다.
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/history/$', views.history),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/edit/$', views.eidt),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/discuss/$', views.discuss),
url(r'^(?P<page_slug>[\w-\+)-(?P<page_id>\w=)/permissions/$', views.permissions),
]
우리는 위의 징그러운 예제를 include를 이용해 다음과 같이 줄일 수 있습니다.
from django.conf.urls import include, url
from . import views
urlpatterns = [
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/', include([
url(r'^history/$', views.history),
url(r'^edit/$', views.edit),
url(r'^discuss/$', views.discuss),
url(r'^permissions/$', views.permissions),
])),
]
(...gif 있음 좋겠다..ㅜㅜ) page_slug부분 한 군데로 모이는 거.. 아님 아쉬운 대로 그림이라도.
11. Including other URLconfs - captured parameters
상위 URL관리자에 포함된 하위 URL은, 상위 URL관리자에서 캡쳐된 파라미터(매개변수)를 받아 사용합니다. 아래의 예를 보세요.
# 위치 : settings/urls/main.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^(?P<username>\w+)/blog/', include('foo.urls.blog')),
]
# 위치 : foo/urls/blog.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.blog.index),
url(r'^archive/$', views.blog.archive),
]
위의 예에서, 캡쳐된 username이라는 변수는 그 뒤에 포함된(=연결된) URL관리자(하위 URL관리자)에게 전달됩니다.