Django의 라우팅 구성(URL과 path 및 re path의 차이점)

35474 단어 Django
url은 Django 1.x에서 쓰는 방법은 Django2.1중, Django를 버리기 시작한다.x의 URL 쓰기.Django2.x에서 url 설정을 묘사하는 두 가지 함수 path와repath,re_path () 함수는django 1이라고 볼 수 있습니다.x에서 url 함수를 가져옵니다. 경로에서 정규를 사용할 수 있습니다.
  url(route, view, kwargs=None, name=None)

  path(route, view, kwargs=None, name=None)

  re_path(route, view, kwargs=None, name=None)

본문은 path와re 를 중점적으로 묘사한다path, 앞의 다섯 가지 내용은 기본적인 운용을 실현할 수 있다
카탈로그
  • 1. 개요
  • 2, django가 요청을 어떻게 처리하는지
  • 3, 변환기(django2.0 이상 기본적으로 path변환기 사용)
  • 4. 정규 표현식 사용
  • 5、include()
  • 6, 사용자 지정 경로 변환기 등록
  • 7, URLconf 일치
  • 8, 보기 매개 변수에 기본값 지정
  • 9, 사용자 정의 오류 보기
  • 10, 스냅된 매개 변수
  • 11, 함수에 추가 옵션 전달
  • 12, URL의 역해석
  • 13, 네스트된 매개변수
  • 1. 개요
    응용 프로그램의 URL을 설계하려면 URL conf (URL 설정) 라는 비공식적인 Python 모듈을 만들 수 있습니다.이 모듈은 순수 Python 코드이며 URL 경로 표현식과 Python 함수 (보기) 사이의 매핑입니다.이 맵은 필요에 따라 짧거나 길 수 있습니다.그것은 다른 맵을 인용할 수 있다.그리고 순수한 파이톤 코드이기 때문에 동적 구조를 할 수 있습니다.
    2. django가 요청을 어떻게 처리하는지
    사용자가 페이지를 요청할 때 Django는 다음 논리에 따라 작업을 수행합니다.
    (1)       URLconf  。  ,  ROOT_URLCONF    ,       HttpRequest    urlconf  (      ),         ROOT_URLCONF  。
    (2)           urlpatterns。   django.conf.urls.url()       。
    (3)      URL  ,     URL            。(  url       )
    (4)              ,         Python  (       ),       。          :
        <1>  HttpRequest   。
        <2>                   ,                        。
        <3>                   ,     django.conf.urls.url()     kwargs  。
        <4>            ,         ,              。
    

    3. 변환기(django2.0 이상에서 기본적으로 사용하는 것은 path 변환기)
    from django.urls import path
        from . import views
    
        urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        path('articles//', views.year_archive),
        path('articles///', views.month_archive),
        path('articles////', views.article_detail),
        ]
    
    /articles/2005/03/       ,   views.month_archive(request, year=2005, month=3)/articles/2003/     ,   views.special_case_2003(request)/articles/2003        ,           ,                ;
    /articles/2003/03/building-a-django-site/        ,   views.article_detail(request, year=2003, month=3, slug="building-a-django-site"
    

    참고:
    (1)     url   ,       ,         ;
    (2)              ,      int。     ,              ,   /      ;
    (3)             /,       ,  url        /。
    

    기본적으로 Django에는 다음과 같은 경로 변환기가 내장되어 있습니다.
    str:         ,     /,            ,          ;
    int:  0    ,    int  
    slug:      。        ASCII           ,  ’ building-your-1st-django-site‘;
    uuid:    uuid     。      ,         ,        ,  ’075194d3-6885-417e-a8a8-6c931e272f00‘ 。    UUID  ;
    path:         ,            ’/‘。              url        url   。
    

    4、정규 표현식 사용
    경로 및 변환기 구문이 URL 모드를 정의하기에 충분하지 않으면 정규 표현식을 사용할 수도 있습니다.re 사용path()가 path() 대신 표시됩니다.
    Python 정규 표현식에서 정규 표현식 그룹의 문법은 (? Ppattern) 이고,name은 그룹의 이름이며,pattern은 일치하는 모드입니다.
    정규 표현식을 사용하여 다시 쓰는 URLconf 예:
    from django.urls import path, re_path
    
    from . import views
    
    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        re_path(r'^articles/(?P[0-9]{4})/$', views.year_archive),
        re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
        re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[\w-]+)/$', views.article_detail),
    ]
    

    예제 URLconf와 차이점:
    (1)       URL      。  ,  10000     ,                 。
    (2)             ,                   。
    (3)    re_path()     path(), re_path()     ,                       ,           。
    (4)                    ,       path('(\d+)/',view)     ,      path('(?P\d+)/',view)         。
    (5)                       ,                       
    

    5、include()
    urlpatterns는 언제든지 다른 URLconf 모듈을 "include"할 수 있습니다.이것은 본질적으로 다른 URL 아래에 있는 '루트' 입니다.
    from django.urls import include, path
    
    urlpatterns = [
        path('community/', include('aggregator.urls')),
        path('contact/', include('contact.urls')),
    ]
    

    Django가 만났을 때include () 는 일치하는 URL의 모든 부분을 차단하고 나머지 문자열을 포함된 URLconf에 보내서 더 이상 처리할 수 있습니다.
    path() 인스턴스 목록을 사용하여 다른 URL 모듈을 포함할 수도 있습니다.예를 들어, 다음 URLconf를 고려합니다.
    from django.urls import include, path
    
    from apps.main import views as main_views
    from credit import views as credit_views
    
    extra_patterns = [
        path('reports/', credit_views.report),
        path('reports//', credit_views.report),
        path('charge/', credit_views.charge),
    ]
    
    urlpatterns = [
        path('', main_views.homepage),
        path('help/', include('apps.help.urls')),
        path('credit/', include(extra_patterns)),
    ]
    

    /credit/reports/는 creditviews.report () 보기 처리.
    URLconf에서 단일 모드 접두사를 반복적으로 사용하는 이중화를 제거할 수 있습니다.
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('-/history/', views.history),
        path('-/edit/', views.edit),
        path('-/discuss/', views.discuss),
        path('-/permissions/', views.permissions),
    ]
    

    공통 경로 접두사를 한 번만 설명하고 다른 접두사를 그룹화할 수 있습니다.
    from django.urls import include, path
    from . import views
    
    urlpatterns = [
        path('-/', include([
            path('history/', views.history),
            path('edit/', views.edit),
            path('discuss/', views.discuss),
            path('permissions/', views.permissions),
        ])),
    ]
    
                                 
    

    6. 사용자 지정 경로 변환기 등록
    더 복잡한 일치 요구에 대해 경로 변환기를 정의할 수 있습니다.
    변환기는 다음과 같은 컨텐트를 포함하는 클래스입니다.
      regex   ,       。
      to_python(self, value)  ,                        。           ,    ValueError。ValueError        ,  404        ,     URL    。
      to_url(self, 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() 다음 명령은 URLconf에 사용자 정의 변환기 클래스를 등록합니다.
    from django.urls import path, register_converter
    from . import converters, views
    
    register_converter(converters.FourDigitYearConverter, 'yyyy')
    
    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        path('articles//', views.year_archive),
        ...
    ]
    

    7. URLconf가 일치하는 내용
    URLconf는 요청한 URL을 정상적인 Python 문자열로 일치시킵니다.GET 또는 POST 매개변수 또는 도메인 이름 및 요청 메서드는 포함되지 않습니다.
    예를 들어, 에 대한 요청https://www.example.com/myapp/, URLconf에서 myapp/를 찾습니다.
    요청 중https://www.example.com/myapp/?page=3, URLconf에서 myapp/를 찾습니다.
    8. 보기 매개 변수에 기본값 지정
    보기 매개 변수에 기본 매개 변수를 지정하는 것이 편리합니다.이것은 예제 URLconf 및 뷰입니다.
    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('blog/', views.page),
        path('blog/page/', views.page),
    ]
    

    두 URL 모드 모두 같은 보기views를 가리킵니다.페이지, 그러나 첫 번째 모드는 URL에서 어떤 내용도 포착하지 않았습니다.첫 번째 모드가 일치하면 이 페이지 () 함수는 기본 인자num를 사용합니다.두 번째 모드가 일치하면 페이지 ()는num에서 포획한 모든 값을 사용합니다.
    9. 사용자 정의 오류 보기
    Django가 요청한 URL의 일치 항목을 찾을 수 없거나 이상이 발생하면 기본 오류 보기를 호출합니다. Django의 기본 오류 보기는 대부분의 웹 프로그램에 충분하지만, 사용자 정의 행동이 필요하면 루트 URLconf에서 이 값을 설정할 수 있습니다. 다른 URLconf에서 이 변수를 설정하면 무효입니다.값은 호출할 수 있거나, 보기의 전체 Python 가져오기 경로를 표시하는 문자열이어야 합니다. 이 보기를 호출해서 현재 오류를 처리해야 합니다.
    이 페이지not_found () 뷰가 handler404를 덮어씁니다.
    handler404 = 'mysite.views.my_custom_page_not_found_view'
    

    이 서버error () 보기가handler500 덮어쓰기:
    handler500 = 'mysite.views.my_custom_error_view'
    

    이 permissiondenied () 보기가handler403에 덮어쓰여집니다.
    handler403 = 'mysite.views.my_custom_permission_denied_view'
    

    이badrequest () 보기가handler400을 덮어씁니다.
    handler400 = 'mysite.views.my_custom_bad_request_view'
    

    10. 스냅된 매개 변수
    포함된 URLconf는 부모 URLconfs로부터 캡처된 매개변수를 수신합니다.
    # In settings/urls/main.py
    from django.urls import include, path
    
    urlpatterns = [
        path('/blog/', include('foo.urls.blog')),
    ]
    
    # In foo/urls/blog.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.blog.index),
        path('archive/', views.blog.archive),
    ]
    

    위의 예에서 캡처된 "username"변수는 include의 URLconf에 예상대로 전달됩니다.
    11. 추가 옵션을 함수에 전달
    URLconfs에는 추가 매개 변수를 Python 사전으로 보기 함수에 전달할 수 있는 갈고리가 있습니다.
    이 path () 함수는 선택할 수 있는 세 번째 인자를 사용할 수 있습니다. 이 인자는view 함수에 전달되는 추가 키워드 인자의 사전이어야 합니다.
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('blog//', views.year_archive, {'foo': 'bar'}),
    ]
    

    이 예에서는 의 요청/blog/2005/에 대해 Django가views를 호출합니다.year_이 기술은 연합 프레임워크에서 메타데이터와 옵션을 보기에 전달하는 데 사용된다.
     :URL               ,                         。       ,           URL      。
    

    마찬가지로 추가 옵션을include()에 전달할 수 있으며, 포함된 URLconf의 줄마다 추가 옵션을 전달합니다.
    예를 들어, 이 두 URLconf 세트는 기능적으로 동일합니다.
    설정 1:
    # main.py
    from django.urls import include, path
    
    urlpatterns = [
        path('blog/', include('inner'), {'blog_id': 3}),
    ]
    
    # inner.py
    from django.urls import path
    from mysite import views
    
    urlpatterns = [
        path('archive/', views.archive),
        path('about/', views.about),
    ]
    

    설정 2:
    # main.py
    from django.urls import include, path
    from mysite import views
    
    urlpatterns = [
        path('blog/', include('inner')),
    ]
    
    # inner.py
    from django.urls import path
    
    urlpatterns = [
        path('archive/', views.archive, {'blog_id': 3}),
        path('about/', views.about, {'blog_id': 3}),
    ]
    

    보기가 실제로 이 옵션을 받아들이든지 않든지 간에 추가 옵션은 항상 포함된 URLconf의 줄마다 전달됩니다.따라서 포함할 URLconf의 각 뷰가 전달할 추가 옵션을 받아들인다는 것을 확인하는 경우에만 유용합니다.
    12. URL의 역해석
    Django 프로젝트에서 작업을 진행할 때, 생성된 내용 (보기와 자산 URL, 사용자에게 표시되는 URL 등) 을 삽입하거나 서버에서 내비게이션 프로세스 측면 (방향을 바꾸는 등) 을 처리하는 최종 형식의 URL을 가져와야 한다.
    Django는 URL 맵이 URL 디자인의 유일한 저장소가 되도록 하는 솔루션을 제공합니다.URLconf와 함께 제공된 다음 두 방향에서 사용할 수 있습니다.
    (1)   /      URL  ,       Django  ,               URL     。
    (2)      Django                 ,     URL。
    

    위(2)는 이른바 URL 역해석, 역URL 일치, 역URL 찾기 또는 약칭 URL 역해석이다.
    Django는 URL 반전을 수행하는 도구를 제공합니다. 이 도구는 URL이 필요한 여러 레이어와 일치합니다.
        :  url    
     Python   :  reverse()  
      Django     URL             :get_absolute_url()  
    

    다음 URLconf 항목을 다시 고려하십시오.
    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('articles//', views.year_archive, name='news-year-archive'),
    ]
    

    다음 템플릿 코드를 사용하여 가져올 수 있습니다.
    <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
    {# Or with the year in a template context variable: #}
    <ul>
    {% for yearvar in year_list %}
    <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
    {% endfor %}
    </ul>
    

    Python 코드에서 다음을 수행합니다.
    from django.http import HttpResponseRedirect
    from django.urls import reverse
    
    def redirect_to_year(request):
        year = 2006
        return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
    

    13. 네스트된 매개변수
    정규 표현식은 매개변수를 네스트할 수 있으며 Django는 매개변수를 분석하여 뷰에 전달합니다.반전하면 Django는 내포된 캡처 매개변수를 무시하고 외부 캡처 매개변수를 모두 채우려고 합니다.페이지 매개 변수를 선택할 수 있는 URL 모드는 다음과 같습니다.
    from django.urls import re_path
    
    urlpatterns = [
        re_path(r'^blog/(page-(\d+)/)?$', blog_articles),                  # bad
        re_path(r'^comments/(?:page-(?P\d+)/)?$', comments),  # good
    ]
    

    이 두 가지 모델은 모두 끼워 넣은 파라미터를 사용하여 해석할 것이다. 예를 들어 블로그/page-2/는 블로그 와articles의 일치, 두 개의 위치 매개 변수를 포함합니다: 페이지 2/2.두 번째 모드는comments/page-2/와 키워드 매개 변수 페이지number 설정은 2로 일치합니다.이 예에서 외부 파라미터는 비포획 파라미터이다.blog_articles 보기는 가장 바깥쪽에서 포획한 파라미터를 반전시켜야 합니다. 이 예에서 페이지-2/또는 파라미터가 없거나comments는 반전시킬 수 있습니다. 파라미터도 필요 없고 페이지도 필요 없습니다number의 값입니다.네스트된 캡처 매개변수는 blog 와 같이 뷰 매개변수와 URL 사이에 강력한 결합을 만듭니다.articles 참조: 보기는 보기가 원하는 값만 받는 것이 아니라 URL의 일부분(page-2/)을 수신합니다.이러한 결합은 반전할 때 더욱 뚜렷하다. 왜냐하면 보기를 반전시키려면 페이지 번호가 아닌 URL 세션을 전달해야 하기 때문이다.
               ,                          。
    

    좋은 웹페이지 즐겨찾기