Django 라우팅 시스템 소개 및 사용

9824 단어
Django의 라우팅 시스템
Django 버전 1.11 URLconf 공식 문서
URL 설정(URLconf)은 Django가 지탱하는 사이트의 디렉터리와 같다.본질은 URL과 URL을 호출하는 뷰 함수 사이의 매핑 테이블입니다.
너는 이런 식으로 Django에게 이 URL에 대해 이 코드를 호출하고 그 URL에 대해 그 코드를 호출한다고 알려라.
URLconf 구성
기본 형식:
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//', views.year_archive),
    path('articles///', views.month_archive),
    path('articles////', views.article_detail),
]

매개변수 설명:
  • 정규 표현식: 정규 표현식 문자열
  • 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),
    ]

    방문http://www.example.com/blog기본적으로 웹 주소를 자동으로http://www.example/com/blog/.
    만약 settings에서.py에서 APPEND 설정SLASH=False, 지금 다시 요청http://www.example.com/blog페이지를 찾을 수 없음을 알립니다.
    그룹 이름 일치
    위의 예제에서는 URL의 값을 포착하고 위치 매개 변수로 보기에 전달하는 간단한 정규 표현식 그룹 매칭 (괄호를 통해) 을 사용합니다.
    더 높은 사용법에서는 URL의 값을 포착하고 키워드 매개 변수로 보기에 전달하는 정규 표현식 그룹을 그룹으로 지정할 수 있습니다.
    Python의 정규 표현식에서 유명한 그룹 이름 정규 표현식 그룹의 문법은 (?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 매개변수와 도메인 이름은 포함되지 않습니다.
    예를 들어,http://www.example.com/myapp/요청 시 URLconf에서 myapp/를 찾습니다.
    에서http://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
    루트 배달은 바로django에 있는 app가 자신의static 파일,templates 폴더,urls를 가지고 있습니다.py등
    프로젝트 이름 아래에 있는 urls.py는 루트와 보기 함수의 대응 관계를 하지 않고 중계소가 되어 요청을 다른 app에 나누어 주고 app에 urls를 새로 만듭니다.py 파일 완성 루트와 보기 함수의 대응 관계
    목적은 모든 앱의 URL 분업을 더욱 명확하게 하고 주 URL에 쓰지 않고 간단명료하게 하는 것이다.
    #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  
    ]

    주의: 주 URL에서는 이 샘플을 쓸 수 없습니다. url(r'^blog/$', include('blog.urls')) 뒤에 있는 $기호는 끝입니다. 일치하면 app에 있는 루트urls로 나누어 줄 수 없습니다.
    보기 함수에 추가 매개 변수를 전달하기 (이해)
    URLconfs에는 파이톤 사전을 보기 함수에 추가 매개 변수로 전달하는 갈고리가 있습니다.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 역해석
    쉽게 말하면 URL 일치 규칙에 이름을 붙이고 URL 일치 모드에 이름을 붙일 수 있습니다.
    이렇게 하면 우리는 앞으로 URL 코드를 쓸 필요가 없고, 이름으로 현재의 URL을 호출하기만 하면 된다.대규모로gaiurl을 사용할 때 url 일치 규칙이 바뀌었기 때문에 우리는 모든 url을 수정할 필요가 없다. 이렇게 하면 시간 자원을 크게 소모할 수 있다.반면에 역해석은 동적 해석의 효과에 도달할 수 있고 하나하나 수정할 필요가 없다.
    간단한 예를 들면 다음과 같습니다.
    url(r'^home', views.home, name='home'),  #    url        home
    url(r'^index/(\d*)', views.index, name='index'),  #    url       index

    이렇게:
    html 템플릿에서 다음과 같이 참조할 수 있습니다.
    {% url 'home' %}
    {% url 'index' 2019 %}

    views 함수에서 다음과 같이 참조할 수 있습니다.
    from django.urls import reverse
    reverse("home")
    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/nnnn/이다.
    html 템플릿의 코드에서 다음과 같은 방법으로 얻을 수 있습니다.
    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을 검색할 때 보기의 이름만으로는 부족합니다.
    요약: 1 html 코드에서 {% URL "별명"매개 변수%}
    2 뷰 함수:
        2.1 url=reverse('test')
        2.2 url=reverse('test',args=(10,20))
    참고:
    위의 예에서 URL 검색을 완료하려면 명명된 URL 모드를 사용해야 합니다.URL 이름에 사용되는 문자열은 원하는 문자를 포함할 수 있습니다.합법적인 파이썬 이름에만 제한된 것이 아닙니다.
    URL 모드를 명명할 때 사용하는 이름이 다른 응용 프로그램의 이름과 충돌하지 않도록 하십시오.만약 URL 모드가 comment라고 하고 다른 응용 프로그램에도 같은 이름이 있다면, 템플릿에서 이 이름을 사용할 때 어떤 URL을 삽입할지 보장할 수 없습니다.
    URL 이름에 접두사를 붙이면 충돌의 가능성을 줄일 수 있습니다.우리는 myapp-comment 대신 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 %}

    views의 함수에서 사용
    v = reverse('app01:detail', kwargs={'pk':11})

    이렇게 하면 앱에서 URL의 이름이 같아도 나는 정확한 URL을 반전시킬 수 있다.

    좋은 웹페이지 즐겨찾기