Django 프레임 베이스의 라우팅 상세 정보

13186 단어 DjangoDjango 라우팅
Django의 라우팅 역할:
**본질은 URL과 이 URL이 호출할 보기 함수 사이의 매핑입니다. Django가 클라이언트에게 보낸 URL에서 어떤 논리 코드를 호출해야 하는지 알려주기 위해서입니다.**
라우팅의 기본 구성:
from django.conf.urls import url

# urlpatterns      url()     Python  
urlpatterns = [
    # url(regex, view, kwargs=None, name=None),
    url(     ,      ,),
]

"""
url()        :
         :          
    views    :       ,                        
      :                (    )
      :     name  ,      
"""

url 함수의 첫 번째 인자를 자세히 설명하기:
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 목록의 요소는 쓰기 순서에 따라 정규 표현식을 위에서 아래로 하나씩 매칭하고 매칭에 성공하면 계속하지 않습니다.
  • urlpatterns가 모든 요소와 일치하도록 요청한 후에도 일치하지 않으면 클라이언트에게 404.
  • URL에서 값을 잡으려면///안에 괄호 한 쌍을 놓고 정규 일치를 쓰면 됩니다. (그룹 일치)
  • 각 URL 앞에 기본적으로 백슬래시가 있으므로 리드 백슬래시를 추가할 필요가 없습니다.예를 들어 ^articles이지 ^/articles가 아니다.
  • 모든 정규 표현식 앞의'r'는 선택할 수 있지만 덧붙이는 것을 권장합니다.정규 문자열의 어떤 문자도 뜻을 바꾸지 않고 원본을 보존합니다. +

  • 라우팅 정규 표현식의 끝에'/'설명을 추가할지 여부:
    from django.conf.urls import url
    from app01 import views
    
    urlpatterns = [
            url(r'^index/$', views.index),  #    '/'  
        url(r'^test$', views.test),  #      '/'
    ]
    

    예를 들면 다음과 같습니다.
    테스트 1: 액세스http://127.0.0.1:8000/index또는http://127.0.0.1:8000/index/결과는 모두 성공적이었다. 왜냐하면 방문했을 때http://127.0.0.1:8000/index시 자동으로 301 리디렉션http://127.0.0.1:8000/index/
    테스트 2: 액세스http://127.0.0.1:8000/test성공한 것이고,http://127.0.0.1:8000/test/실패할 거예요.
    그렇다면 도대체 무슨 이유일까?어떻게 이럴 수가 있지?
    만약 루트의 끝에 '/' 이 있지만 요청한 URL의 끝에 '/' 가 붙지 않았을 때 URL에 꼬리 빗장을 추가할 지 여부입니다. False는 APPEND 를 추가하지 않습니다.SLASH=True # Django의 글로벌settings의 기본 설정
    테스트 1:http://127.0.0.1:8000/indexWrite Access가 성공한 이유는 APPEND 때문입니다.SLASH는 기본적으로 True로 설정되어 있지만, 이 설정을False로 바꾸면 r '^index/$' 루트에 접근할 때 끝에 '/' 를 붙여야 합니다.
    총괄: 이 테스트는 루트를 정의할 때 마지막에'/'를 더하면 루트가 더욱 유연해진다는 것을 설명할 수 있다.
    이름이 없는 정규 표현식 그룹:
    #                                    
    
    #    
    url(r'^test/(\d+)/',views.test),  #          
    
    #    
    def test(request, num):   # num            ,            
        print(num)
        return HttpResponse('test')
    

    명명된 정규 표현식 그룹:
    Python의 정규 표현식에서 정규 표현식 그룹을 나누는 문법은 (? Ppattern) 이고,name은 그룹의 이름이며,pattern은 일치하는 모드입니다
    #                                     
    
    #    
    url(r'^test/(?P\d+)/',views.test),  #          
    
    #    
    def test(request, year):  #                  
        print(year)
        return HttpResponse('test')
    

    다음은 이름이 있는 정규 표현식 그룹을 사용하여 다시 쓰는 코드입니다.
    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(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), 
    #        
    url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive), 
    #        ,            
    url(r'^articles/(?P[0-9]{4})/([0-9]{2})/$', views.month_archive),
    

    정규 표현식 그룹이 캡처한 매개변수는 문자열 유형입니다.
    모든 포획된 매개 변수는 정규 표현식이 어떤 일치 방식을 사용하든지 간에 일반적인 Python 문자열로 보기에 전달됩니다.예를 들어,
    url(r'^articles/(?P[0-9]{4})/$', views.year_archive),
    

    views에 전달합니다.year_archive () 의 year 매개 변수는 정수가 아닌 문자열입니다. [0-9] {4} 정수 문자열만 일치해도
    보기 매개 변수의 기본값을 지정합니다.
    보기 매개 변수의 기본값을 지정하는 데 편리한 팁을 드리겠습니다.URLconf 및 뷰의 예:
    # URLconf
    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^blog/$', views.page),
        url(r'^blog/page(?P[0-9]+)/$', views.page),
    ]
    
    # View (in blog/views.py)
    def page(request, num="1"):
        #          ...
    

    위의 예에서는 다음과 같이 설명합니다.
    두 URL은 같은 보기views를 가리킨다.page
    그러나 첫 번째 값은 URL에서 캡처되지 않습니다.첫 번째 일치가 성공하면 페이지 () 함수에서num는 기본 매개 변수 값 "1"을 사용합니다.
    		         ,`page()`            `num`  。
    

    우리의 보기 함수 중의 일반 매개 변수가 기본 매개 변수로 바뀐 후에 우리의 보기 함수를 더욱 유연하게 할 수 있다. 그러면 우리는 하나의 보기 함수를 여러 가지 경로로 유연하게 사용할 수 있다.

    좋은 웹페이지 즐겨찾기