Django 라우팅 계층 URLconf 작용 및 원리 해석

1. Django 라우팅의 역할
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\d+)/(?P\w+)$', views.test3),
유명한 그룹은 몇 개의 값을 나누고, 보기 함수는 몇 개의 값을 받아들여야 한다.
유명과 무명은 섞어서 쓰면 안 돼요.
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),
]
기본 규칙:
  • 괄호(<>)를 사용하여 url에서 값을 캡처합니다..
  • 포획값에는 변환기 형식(converter type)이 포함될 수 있습니다. 예를 들어 을 사용하여 정수 변수를 포획할 수 있습니다.전환기가 없으면 문자열과 일치합니다. 물론/문자도 포함됩니다
  • 선행 슬래시를 추가할 필요가 없습니다..
  • 다음은 2.0 공식 문서에 근거하여 정리된 예시 분석표입니다. (위 URL과 일치하는 관계)
    path 전환기
    문서 원문은 Path converters이며 잠시 전환기로 번역됩니다.
    Django는 기본적으로 다음 5개의 전환기를 지원합니다.
  • str, 경로 구분자 (/) 를 제외한 비공식 문자열과 일치합니다. 이것은 기본 형식입니다
  • int, 정수 일치, 0 포함..
  • slug, 알파벳, 숫자, 가로줄, 밑줄로 구성된 문자열과 일치..
  • uuid, 포맷된 uid와 일치합니다. 예를 들어 075194d3-6885-417e-a8a8-6c931e272f00..
  • path, 비빈 문자열과 일치하며 경로 구분자 (/) 를 포함합니다(사용할 수 없습니까?)
  • 사용자 정의 전환기 등록
    복잡하거나 복용할 필요가 있으면 자신의 전환기를 정의할 수 있다.전환기는 클래스 또는 인터페이스로 다음과 같은 세 가지 요구 사항이 있습니다.
  • regex 클래스 속성, 문자열 형식
  • to_python(self,value) 방법,value는 클래스 속성 regex가 일치하는 문자열로, Django가 대응하는 보기 함수에 전달할 수 있도록 구체적인 Python 변수 값을 되돌려줍니다
  • to_url(self,value) 방법, 그리고 to_python 반대로value는 구체적인 Python 변수 값으로 문자열을 되돌려줍니다. 보통 url 역방향 인용에 사용됩니다
  • 예:
    
    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), 
      ... 
    ]
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기