Django의 라우팅 시스템
기본 형식
from django.conf.urls import url
urlpatterns = [
url( , views , , ),
]
매개변수 설명:
기본 구성
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
주의 사항
# URL / /
APPEND_SLASH=True
Django settings.py 구성 파일에는 기본적으로 APPEND 가 없습니다.SLASH 매개 변수이지만 Django 기본값은 APPENDSLASH = True. 그 역할은 바로 자동으로 사이트 끝부분에'/'를 붙이는 것이다.
그 효과는 다음과 같다.
우리는 urls를 정의했다.py:
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^blog/$', views.blog),
]
그룹 이름 일치
더 높은 사용법에서는 URL의 값을 포착하고 키워드 매개 변수로 보기에 전달하기 위해 그룹 이름이 일치하는 정규 표현식 그룹을 사용할 수 있습니다.파이톤의 정규 표현식에서 정규 표현식 그룹을 나누는 문법은
(?Ppattern)
이고 그 중에서 name
는 그룹의 이름이고 pattern
는 일치하는 모델이다.다음은 위의 URLconf에서 명명된 그룹을 사용한 재작성입니다.
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.article_detail),
]
이것은 앞의 예시와 완전히 같고 단지 하나의 미세한 차이만 있다. 포획된 값은 위치 파라미터가 아니라 보기 함수에 키워드 파라미터로 전달된다.예를 들어 URL/articles/2017/12/는 다음과 같은 방식으로 보기 함수를 호출하는 것과 같다.
views.month_archive(request, year="2017", month="12")
실제 응용에서 그룹 이름이 일치하는 방식을 사용하면 URLconf가 더욱 명확하고 매개 변수의 순서에 문제가 생기기 쉽지 않지만, 일부 개발자들은 그룹 이름 문법이 너무 추악하고 번거롭다고 생각한다.
어떤 것을 사용해야 할지 취향에 따라 결정할 수 있다.URLconf가 일치하는 위치 URLconf는 요청한 URL에서 일반적인 Python 문자열로 찾습니다.GET 및 POST 매개변수와 도메인 이름은 포함되지 않습니다.
예를 들어,
https://www.example.com/myapp/
요청에서 URLconf가 myapp/를 찾습니다.https://www.example.com/myapp/?page=3
요청에서도 URLconf에서 myapp/를 찾습니다.URLconf에서 요청 방법을 확인하지 않습니다.다시 말하면 모든 요청 방법인 같은 URL의POST,GET,HEAD 등은 같은 함수로 연결된다.포획된 매개 변수는 영원히 문자열입니다. URLconf에서 포획된 매개 변수는 정규 표현식이 어떤 일치 방식을 사용하든지 간에 일반적인 Python 문자열로 보기에 전달됩니다.예를 들어 다음 줄의 URLconf에서:
url(r'^articles/(?P[0-9]{4})/$', views.year_archive)
보기 함수 views.year_archive()
에 전달된 year 매개 변수는 영원히 문자열 형식입니다.보기 함수에 기본값 지정# urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P[0-9]+)/$', views.page),
]
# views.py , num
def page(request, num="1"):
pass
위의 예에서 두 URL 모드는 같은view-views를 가리킵니다.페이지 - 첫 번째 모드에서는 URL에서 아무것도 캡처하지 않습니다.
첫 번째 모드가 일치하면 페이지 () 함수는 기본 인자num="1"을 사용하고, 두 번째 모드가 일치하면 페이지 () 는 정규 표현식으로 포착된num값include 기타 URLconfs를 사용합니다
#At any point, your urlpatterns can “include” other URLconf modules. This
#essentially “roots” a set of URLs below other ones.
#For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs:
from django.conf.urls import include, url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')), # URLconfs
]
보기 함수에 추가 매개 변수를 전달하는 URLconfs는 갈고리를 가지고 있으며, Python 사전을 보기 함수에 추가 매개 변수로 전달합니다.
django.conf.urls.url () 함수는 보기 함수에 전달하고자 하는 추가 키워드 인자를 표시하는 세 번째 인자를 받을 수 있습니다.
예를 들면 다음과 같습니다.
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]
이 예에서 Django는/blog/2005/요청에 대해views를 호출합니다.year_archive(request, year='2005', foo='bar'). 이 기술은 Syndication 프레임워크에서 사용되며, 보기에 메타데이터와 옵션을 전달합니다.
명명된 URL 및 URL 역해석
Django 프로젝트를 사용할 때 흔히 볼 수 있는 요구 사항은 URL의 최종 형식을 얻어서 생성된 내용(보기와 사용자에게 표시되는 URL 등)에 삽입하거나 서버 측의 내비게이션(리셋 등)을 처리하는 것이다.사람들은 이러한 URL을 억지로 인코딩하지 않기를 강력히 바란다. (힘들고 확장할 수 없고 오류가 발생하기 쉽다.) 또는 URLconf와 무관한 전문적인 URL 생성 메커니즘을 설계하지 않기를 바란다. 왜냐하면 이렇게 하면 어느 정도에 기한이 지난 URL이 생기기 쉽기 때문이다.다시 말하면 DRY 메커니즘이 필요하다.다른 점을 제외하고, 디자인된 URL은 프로젝트의 원본 코드를 옮겨다니지 않고 오래된 URL을 검색하고 바꿀 수 있도록 자동으로 업데이트할 수 있다.URL을 가져올 때 가장 먼저 떠오르는 정보는 URL의 보기 표식(예를 들어 이름)을 처리하고 정확한 URL을 찾는 데 필요한 다른 정보는 보기 파라미터의 유형(위치 파라미터, 키워드 파라미터)과 값이 있습니다.Django는 URL 매핑이 URL 디자인의 유일한 부분이라는 방법을 제공합니다.URLconf를 채우고 양방향으로 사용할 수 있습니다.
쉽게 말하면 URL 일치 규칙에 이름을 붙이고 URL 일치 모드에 이름을 붙일 수 있습니다.
이렇게 하면 우리는 앞으로 URL 코드를 쓸 필요가 없고, 이름으로 현재의 URL을 호출하기만 하면 된다.
간단한 예를 들면 다음과 같습니다.
url(r'^home', views.home, name='home'), # url home
url(r'^index/(\d*)', views.index, name='index'), # url index
이렇게:
템플릿에서 이렇게 인용할 수 있습니다:
{% url 'home' %}
views 함수에서 이렇게 인용할 수 있습니다:from django.urls import reverse
reverse("index", args=("2018", ))
예: 다음 URLconf를 고려합니다.
from django.conf.urls import url
from . import views
urlpatterns = [
# ...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
# ...
]
이곳의 디자인에 따르면 어느 해 nnn에 대응하는 압축 파일의 URL은/articles/nnnnn/이다.
템플릿 코드에서 다음 방법을 사용하여 템플릿을 얻을 수 있습니다.
2012 Archive
{% for yearvar in year_list %}
- {{ yearvar }} Archive
{% endfor %}
Python 코드에서 다음을 사용합니다.
from django.urls import reverse
from django.shortcuts import redirect
def redirect_to_year(request):
# ...
year = 2006
# ...
return redirect(reverse('news-year-archive', args=(year,)))
만약 어떤 이유로 연간 압축 파일의 URL을 조정해야 한다고 결정한다면, URLconf의 내용을 수정하기만 하면 됩니다.
어떤 장면에서는 하나의 보기가 통용되기 때문에 URL과 보기 사이에 다대일의 관계가 존재한다.이러한 경우 URL을 검색할 때 보기의 이름만으로는 부족합니다.
참고:
위의 예에서 URL 검색을 완료하려면 명명된 URL 모드를 사용해야 합니다.URL 이름에 사용되는 문자열은 원하는 문자를 포함할 수 있습니다.합법적인 파이썬 이름에만 제한된 것이 아닙니다.
URL 모드를 명명할 때 사용하는 이름이 다른 응용 프로그램의 이름과 충돌하지 않도록 하십시오.만약 URL 모드가comment이고 다른 응용 프로그램에도 같은 이름이 있다면, 템플릿에서 이 이름을 사용할 때 어떤 URL을 삽입할지 보장할 수 없습니다.
URL 이름에 접두사를 붙이면 충돌의 가능성을 줄일 수 있습니다.우리는 comment 대신 myapp-comment를 사용하는 것을 권장합니다.
네임스페이스 모드
서로 다른 앱이 같은 URL 이름을 사용하더라도 URL의 네임스페이스 모드는 유일하게 이름을 반전시킬 수 있다.
예를 들면 다음과 같습니다.
프로젝트의 urls.py
from django.conf.urls import url, include
urlpatterns = [
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
]
app01의 urls.py
from django.conf.urls import url
from app01 import views
app_name = 'app01'
urlpatterns = [
url(r'^(?P\d+)/$', views.detail, name='detail')
]
app02의 urls.py
from django.conf.urls import url
from app02 import views
app_name = 'app02'
urlpatterns = [
url(r'^(?P\d+)/$', views.detail, name='detail')
]
현재, 나의 두 앱에서 URL 이름이 중복되었다. 내가 URL을 반전할 때, 명명 공간의 이름을 통해 나의 현재 URL을 얻을 수 있다.
구문:
'네임스페이스 이름: URL 이름'
템플릿에서 사용:
{% url 'app01:detail' pk=12 pp=99 %}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.