Django의 라우팅 시스템

9101 단어
공식 문서: URL 설정(URLconf)은 Django가 지탱하는 사이트의 디렉터리와 같다.본질은 URL과 URL을 호출할 뷰 함수 사이의 매핑 테이블입니다.너는 이런 식으로 Django에게 이 URL에 대해 이 코드를 호출하고 그 URL에 대해 그 코드를 호출한다고 알려라.
  • Django 루트 시스템이 URL 경로와 일치할 때 위에서 아래로 등록 순서대로 온다
  • Django의 라우팅 시스템은 URL 경로만 일치하고 도메인 이름, 포트, URL 매개 변수는 일치하지 않습니다
  • URLconf 구성
    기본 형식
    from django.conf.urls import url
    
    urlpatterns = [
         url(     , views    ,  ,  ),
    ]
    

    매개변수 설명:
  • 정규 표현식: 정규 표현식 문자열
  • views 보기 함수: 보통 보기 함수나 보기 함수 경로를 지정하는 문자열
  • 매개 변수: 보기 함수에 전달할 기본 매개 변수 (사전 형식)
  • 별명: 선택할 수 있는name 매개 변수
  • 정규 표현식 상해
    기본 구성
    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),
    ]
    

    주의 사항
  • urlpatterns의 요소는 쓰기 순서에 따라 위에서 아래로 정규 표현식을 하나씩 매칭하고 매칭에 성공하면 계속하지 않습니다.
  • URL에서 값을 캡처하려면 그 주위에 괄호 한 쌍(그룹 일치)을 놓아야 한다.
  • 각 URL에 백슬래시가 있으므로 리드 백슬래시를 추가할 필요가 없습니다.예를 들어 ^articles이지 ^/articles가 아니다.
  • 모든 정규 표현식 앞의'r'는 선택할 수 있지만 덧붙이는 것을 권장합니다.추가 설명
  • #     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 요청에 따라 올바른 Django 보기를 호출하고 URL에서 매개 변수에 필요한 값을 추출합니다.
  • Django 뷰의 ID와 전달할 매개변수의 값을 기준으로 연관된 URL을 가져옵니다.첫 번째 방식은 우리가 앞의 장과 절에서 줄곧 토론한 용법이다.두 번째 방법은 URL 역해석, URL 일치 역방향, URL 조회 역방향, 간단한 URL 역방향 검색입니다.URL이 필요한 경우 Django에서 URL 검색을 위한 다양한 도구를 제공합니다
  • .
  • 템플릿에서: url 템플릿 탭을 사용합니다.
  • 파이톤 코드에서: 사용
  • django.core.urlresolvers.reverse () 함수.Django 모델 인스턴스 처리와 관련된 상위 코드에서: get 사용absolute_url () 방법.위에서 한 무더기의 말을 했지만, 너는 아마 이해하지 못했을 것이다.(그것은 공식 문서의 딱딱한 번역이다).

  • 쉽게 말하면 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
    
    
    

    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 %}

    좋은 웹페이지 즐겨찾기