Django
URL 라우팅
수색…
장고가 요청을 처리하는 방법
Django는 들어오는 URL 경로를보기 기능으로 라우팅하여 요청을 처리합니다. 뷰 기능은 요청을하는 클라이언트에게 응답을 돌려 보내는 역할을합니다. 다른 URL은 일반적으로 다른보기 기능에 의해 처리됩니다. 특정보기 기능으로 요청을 라우팅하기 위해 Django는 URL 구성 (또는 URLconf)을 찾습니다. 기본 프로젝트 템플릿은 <myproject>/urls.py
URLconf를 정의합니다.
귀하의 URLconf라는 속성을 정의하는 파이썬 모듈해야 urlpatterns
의 목록입니다, django.conf.urls.url()
인스턴스를. 각 url()
인스턴스는 최소한 URL에 일치하는 정규 표현식 (정규식)과 대상 (보기 기능 또는 다른 URLconf)을 정의해야합니다. URL 패턴이보기 기능을 대상으로하는 경우 나중에 패턴을 쉽게 참조 할 수있는 이름을 지정하는 것이 좋습니다.
기본 예제를 살펴 보겠습니다.
# In <myproject>/urls.py
from django.conf.urls import url
from myapp.views import home, about, blog_detail
urlpatterns = [
url(r'^$', home, name='home'),
url(r'^about/$', about, name='about'),
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
]
이 URLconf는보기를 대상으로하는 세 가지 URL 패턴을 정의합니다. home
, about
및 blog-detail
.
-
url(r'^$', home, name='home'),
정규식은 시작 앵커 '^'를 포함하고 바로 뒤에 '$'라는 끝 앵커가옵니다. 이 패턴은 URL 경로가 빈 문자열 인 요청을 일치 myapp.views
정의 된 home
보기로 myapp.views
합니다.
-
url(r'^about/$', about, name='about'),
이 정규식은 시작 앵커 다음 about/
와 앵커에 about/
리터럴 문자열이옵니다. 그러면 URL /about/
과 일치하고 about
보기로 라우팅됩니다. 비어 있지 않은 모든 URL은 /
시작하기 때문에 Django는 편리하게 첫 번째 슬래시를 자릅니다.
-
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
이 정규식은 좀 더 복잡합니다. 이전 패턴과 마찬가지로 시작 앵커와 리터럴 문자열 blog/
정의합니다. 다음 부분 (?P<id>\d+)
캡처 그룹이라고합니다. 캡처 그룹은 이름에서 알 수 있듯이 문자열의 일부를 캡처하고 캡처 된 문자열을 뷰 함수의 인수로 전달합니다.
캡처 그룹의 구문은 (?P<name>pattern)
입니다. name
은 Django가 뷰에 인수를 전달할 때 사용하는 이름 인 그룹의 이름을 정의합니다. 패턴은 그룹에서 일치하는 문자를 정의합니다.
이 경우, 이름은 id
, 그래서 함수 blog_detail
매개 변수의 이름을 수용해야 id
. 패턴은 \d+
입니다. \d
는 패턴이 숫자 문자와 만 일치 함을 나타냅니다. +
는 패턴이 하나 이상의 문자와 일치해야 함을 나타냅니다.
몇 가지 일반적인 패턴 :
무늬 | 사용 | 성냥 |
---|---|---|
\d+ | 신분증 | 하나 이상의 숫자 문자 |
[\w-]+ | 강타 | 하나 이상의 영숫자, 밑줄 또는 대시 |
[0-9]{4} | 년 (긴) | 네 개의 숫자, 0부터 9까지 |
[0-9]{2} | 년 (짧은) 달 매일 | 두 숫자, 0부터 9까지 |
[^/]+ | 경로 세그먼트 | 슬래시를 제외한 모든 것 |
blog-detail
패턴의 캡쳐 그룹 뒤에는 리터럴 /
, 그리고 끝 앵커가옵니다.
유효한 URL은 다음과 같습니다.
-
/blog/1/ # passes id='1'
-
/blog/42/ # passes id='42'
잘못된 URL은 다음과 같습니다.
-
/blog/a/ # 'a' does not match '\d'
-
/blog// # no characters in the capturing group does not match '+'
장고는 그들이에 정의 된 같은 순서로 각 URL 패턴 처리 urlpatterns
. 여러 패턴이 동일한 URL과 일치 할 수있는 경우 중요합니다. 예 :
urlpatterns = [
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
url(r'blog/overview/$', blog_overview, name='blog-overview'),
]
위 URLconf에서 두 번째 패턴에 도달 할 수 없습니다. 패턴은 URL /blog/overview/
와 일치하지만 blog_overview
보기를 호출하는 대신 URL은 먼저 blog-detail
패턴과 일치하고 blog_detail
보기를 인수 slug='overview'
호출합니다.
URL /blog/overview/
가 blog_overview
보기로 라우팅되도록하려면 패턴을 blog-detail
패턴 위에 배치해야합니다.
urlpatterns = [
url(r'blog/overview/$', blog_overview, name='blog-overview'),
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
]
재사용 가능한 앱의 URL 네임 스페이스 설정 (Django 1.9 이상)
app_name
속성을 설정하여 URL 네임 스페이스를 자동으로 사용하도록 앱의 URLconf를 구성합니다.
# In <myapp>/urls.py
from django.conf.urls import url
from .views import overview
app_name = 'myapp'
urlpatterns = [
url(r'^$', overview, name='overview'),
]
이렇게하면 응용 프로그램 네임 스페이스 가 루트 URLconf>에 포함될 때 'myapp'
됩니다. 재사용 가능한 앱 사용자는 URL을 포함하는 것 외에 다른 설정을 할 필요가 없습니다.
# In <myproject>/urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^myapp/', include('myapp.urls')),
]
재사용 가능한 앱은 이제 애플리케이션 네임 스페이스를 사용하여 URL을 바꿀 수 있습니다.
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
루트 URLconf는 namespace
매개 변수를 사용하여 인스턴스 네임 스페이스를 설정할 수 있습니다.
# In <myproject>/urls.py
urlpatterns = [
url(r'^myapp/', include('myapp.urls', namespace='mynamespace')),
]
응용 프로그램 네임 스페이스와 인스턴스 네임 스페이스를 모두 사용하여 URL을 리버스 할 수 있습니다.
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
>>> reverse('mynamespace:overview')
'/myapp/overview/'
인스턴스 네임 스페이스는 명시 적으로 설정되지 않은 경우 응용 프로그램 네임 스페이스를 기본값으로 사용합니다.