Django 라우팅 계층 URLconf 작용 및 원리 해석
URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다.
당신은 이런 방식으로 Django에게 이 URL에 대해 이 코드를 호출하고, 그 URL에 대해 그 코드를 호출한다고 알려 줍니다.
from django.conf.urls import url
urlpatterns = [
url( , views , , ),
]
Django 2.0 버전의 라우팅 시스템은 다음 방법으로 교체되었습니다.
from django.urls import path
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
url은 함수입니다. 네 개의 매개 변수가 있습니다. 첫 번째 매개 변수는 정규 표현식, 두 번째 매개 변수는 메모리 주소, 세 번째 매개 변수는 기본 매개 변수, 네 번째 매개 변수는 루트의 별명입니다.정규 표현식: 정규 표현식 문자열 #
views 보기 함수: 호출 가능한 대상, 보통 보기 함수나 보기 함수 경로를 지정하는 문자열#
매개 변수: 보기 함수에 전달할 기본 매개 변수 (사전 형식) 선택
별명: 선택적인name 매개 변수
간단한 라우팅 구성
from django.urls import path,re_path
from app01 import views
urlpatterns = [
re_path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/([0-9]{4})/$', views.year_archive),
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
1. urlpatterns의 요소는 쓰기 순서에 따라 위에서 아래로 정규 표현식을 하나씩 일치하고 일치하면 계속하지 않습니다.2. URL에서 값을 캡처하려면 그 주위에 괄호 한 쌍(그룹 일치)을 배치해야 합니다.
3. 각 URL이 있기 때문에 선행 백슬래시를 추가할 필요가 없습니다.예를 들어 ^articles가 아니라 ^/articles가 되어야 한다.
4. 각 정규 표현식 앞의'r'는 선택할 수 있지만 권장합니다.
일부 요청의 예
참고:
# URL 액세스 주소 뒤에/이 (가) 아닌/의 경로가 있는 구성 항목으로 이동할지 여부
APPEND_SLASH=True
Django settings.py 구성 파일에 기본적으로 APPEND_ 없음SLASH 이 매개변수는 Django에서 기본적으로 APPEND_SLASH = True. 그 역할은 자동으로 사이트 끝에'/'을 추가하는 것이다.
그 효과는 다음과 같다.
우리는 urls를 정의했다.py:
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^blog/$', views.blog),
]
방문http://www.example.com/blog사이트 주소가 자동으로http://www.example/com/blog/.하면, 만약, 만약...py에 APPEND_ 설정SLASH=False, 이제 다시 요청하겠습니다.http://www.example.com/blog페이지를 찾을 수 없다는 메시지가 표시됩니다.
2. 라우팅된 그룹
위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로 뷰에 전달하는 간단한 이름 없는 정규 표현식 그룹을 사용합니다.고급 사용법에서는 지정된 정규 표현식 그룹을 사용하여 URL의 값을 캡처하여 키워드 매개변수로 뷰에 전달할 수 있습니다.Python 정규 표현식에서 정규 표현식 그룹을 명명하는 문법은 (?) Ppattern입니다. 그 중에서name는 그룹의 이름이고pattern은 일치하는 모델입니다.다음은 위 URLconf에서 명명된 그룹을 사용한 재작성입니다.
from django.urls import path,re_path
from app01 import views
urlpatterns = [
re_path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
이 실현은 앞의 예시와 완전히 같고 미세한 차이만 있다. 포획된 값은 위치 파라미터가 아닌 키워드 파라미터로 보기 함수에 전달된다.예:/articles/2005/03/요청은views를 호출합니다.month_archive(request, year='2005','month='03') 함수는views가 아닙니다.month_archive(request, '2005', '03').
/articles/2003/03/03/요청은 함수views를 호출합니다.article_detail(request, year='2003', month='03', day='03').
conclusion:
라우팅된 이름 없는 그룹
url(r'^test2/(\d+)/(\w+)$', views.test2),
무명 그룹은 몇 개의 값을 나누고, 보기 함수는 몇 개의 값을 받아들여야 한다.
라우팅의 유명한 그룹
url(r'^test3/(?P
유명한 그룹은 몇 개의 값을 나누고, 보기 함수는 몇 개의 값을 받아들여야 한다.
유명과 무명은 섞어서 쓰면 안 돼요.
3. 라우팅 배포
Django1.1 버전 배포
from django.conf.urls import url,include
# urls
from django.urls import path,re_path,include
from app01 import views
from app01 import urls
urlpatterns = [
# re_path(r'^app01/',include('app01.urls')),#
# re_path(r'^app01/&',include('app01.urls')),#
# path('app01/',include('app01.urls')),#
#path('app01/', include(urls)),
]
app01에서 urls 만들기
from django.urls import path,re_path
from app01 import views
urlpatterns = [
re_path(r'^test/(?P<year>[0-9]{2})/$',views.url_test),
]
4. 역방향 해석Django 프로젝트를 사용할 때 흔히 볼 수 있는 요구 사항은 생성된 내용(보기와 사용자에게 표시되는 URL 등)에 삽입하거나 서버 측의 내비게이션을 처리하는 데 사용되는 URL의 최종 형식입니다.사람들은 이러한 URL을 억지로 인코딩하지 않기를 강력히 바란다. (힘들고 확장할 수 없으며 오류가 발생하기 쉽다) 또는 URLconf와 전혀 관련이 없는 전문적인 URL 생성 메커니즘을 설계하지 않기를 바란다. 왜냐하면 이렇게 하면 어느 정도에 기한이 지난 URL이 생기기 쉽기 때문이다.
Django는 URL이 필요한 경우 계층별로 URL 재검색을 위한 다양한 도구를 제공합니다.
템플릿에서: URL 템플릿 탭을 사용합니다.
Python 코드에서:from django를 사용합니다.urls import reverse () 함수
urls.py
from django.urls import path,re_path
from app01 import views
urlpatterns = [
re_path(r'^test/(?P<year>[0-9]{2})/(?P<month>[0-9]{2})/$',views.url_test,name='test'),
]
html<a href="{% url 'test' 10 23 %}" rel="external nofollow" > </a>
뷰 함수:
from django.shortcuts import render, HttpResponse,redirect,reverse
def url_test(request,year,month):
print(year)
print(month)
url=reverse('test',args=(10,20))
print(url)
return HttpResponse('ok')
conclusion:1 html 코드에서 {% url "별명"매개 변수%}
2 뷰 함수에서:
2.1 url=reverse('test')
2.2 url=reverse('test',args=(10,20))
URL 모드의 이름을 지정할 때 사용하는 이름이 다른 응용 프로그램의 이름과 충돌하지 않도록 하십시오.만약 당신의 URL 모드가comment라고 하고, 다른 응용 프로그램에도 같은 이름이 있다면, 템플릿에서 이 이름을 사용할 때 어떤 URL을 삽입할지 보장할 수 없습니다.URL 이름에 접두사, 예를 들어 응용 프로그램의 이름을 추가하면 충돌의 가능성을 줄일 수 있습니다.우리는 comment가 아니라 my app-comment를 사용하는 것을 건의합니다.
5. 명칭 공간
네임스페이스 (영어: Namespace) 는 식별자의 표시 범위를 나타냅니다.하나의 식별자는 여러 개의 명칭 공간에서 정의할 수 있으며, 서로 다른 명칭 공간에서의 의미는 서로 상관없다.이렇게 하면 새로운 명칭 공간에서 어떤 표지부호도 정의할 수 있다. 왜냐하면 기존의 정의는 다른 명칭 공간에 있기 때문이다.name에 역할 영역이 없기 때문에 Django는 URL을 반해할 때 프로젝트 전역 순서로 검색합니다. 첫 번째name가 지정한 URL을 찾을 때 바로 되돌아옵니다. 저희가 프로젝트를 개발할 때name 속성을 사용하여 URL을 반해합니다. 조심하지 않아 서로 다른 앱의 URL에서 같은name을 정의할 때 URL 반해 오류가 발생할 수 있습니다. 이런 일을 피하기 위해 이름 공간을 도입했습니다.
프로젝트의 URL입니다.py:
urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^app01/', include("app01.urls",namespace="app01")),
re_path(r'^app02/', include("app02.urls",namespace="app02")),
]
app01.urls:urlpatterns = [
re_path(r'^index/', index,name="index"),
]
app02.urls:
urlpatterns = [
re_path(r'^index/', index,name="index"),
]
app01.views
from django.core.urlresolvers import reverse
def index(request):
return HttpResponse(reverse("app01:index"))
app02.views
from django.core.urlresolvers import reverse
def index(request):
return HttpResponse(reverse("app02:index"))
6. django2.0 버전 path
django2.0의re_path는 1.0의 URL과 같습니다.
사고 방식은 다음과 같습니다.
urlpatterns = [
re_path('articles/(?P<year>[0-9]{4})/', year_archive),
re_path('article/(?P<article_id>[a-zA-Z0-9]+)/detail/', detail_view),
re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/edit/', edit_view),
re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/delete/', delete_view),
]
다음 두 가지 문제를 고려하십시오.첫 번째 문제, 함수 year_archive에서 year 매개 변수는 문자열 형식이기 때문에 정수 형식의 변수 값으로 전환해야 합니다. 물론 year=int(year)에는 TypeError나 ValueError와 같은 이상이 없습니다.그러면 URL에서 이 전환 절차를 Django가 자동으로 완성할 수 있는 방법이 있습니까?
두 번째 질문, 세 가지 루트 중article_id는 모두 같은 정규 표현식이지만 세 번 써야 합니다. 그 다음에article_id 규칙이 바뀌면 세 곳의 코드를 동시에 수정해야 합니다. 그러면 한 군데만 수정하면 되는 방법이 있습니까?
Django2.0에서는 path를 사용하여 위의 두 문제를 해결할 수 있습니다.
기본 예
이것은 간단한 예이다.
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),
# path ,re_path
path('order/<int:year>',views.order),
]
기본 규칙:path 전환기
문서 원문은 Path converters이며 잠시 전환기로 번역됩니다.
Django는 기본적으로 다음 5개의 전환기를 지원합니다.
복잡하거나 복용할 필요가 있으면 자신의 전환기를 정의할 수 있다.전환기는 클래스 또는 인터페이스로 다음과 같은 세 가지 요구 사항이 있습니다.
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
register_ 사용하기converter URL 구성에 등록:
from django.urls import register_converter, path
from . import converters, views
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<yyyy:year>/', views.year_archive),
...
]
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.