수색…


장고가 요청을 처리하는 방법

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 , aboutblog-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/'

인스턴스 네임 스페이스는 명시 적으로 설정되지 않은 경우 응용 프로그램 네임 스페이스를 기본값으로 사용합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow