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관리자)에게 전달됩니다.

results matching ""

    No results matching ""