[django] 루트 시스템 URL

10150 단어 Django
url
django1.x
from django.conf.urls import url

1. 단일 루트 대응
url(r'^index$', views.index)

2. 정규에 기초한 루트
url(r'^index/(\d*)/(\d*)/', views.index)
#              
def index(request, a1, a2):
	
url(r'^manage/(?P\w*)/(?P\d*)', views.manage)
#         ,    
def index(request, name, id):

3、추가 매개 변수 추가**kwargs
url(r'^manage/(?P\w*)', views.manage,{'id':333})

4. 라우팅 맵의 이름을 설정합니다name
url(r'^home', views.home, name='h1')
url(r'^index/(\d*)', views.index, name='h2')

이름을 설정하면 다음과 같이 다른 곳에서 호출할 수 있습니다.
  • 템플릿에서 생성 URL 사용
    url            
    {% url 'h2' 2012 %}
    
  • 함수에서 생성 URL 사용
    from django.urls import reverse
    url(r'^index/(\d*)', views.index, name='h2')
    
    reverse('h2', args=(2012,)) 
    #  
    url(r'^index/(?P\d+)/', views.index, name='h1')
    reverse('h1', kwargs={"a1": 111}) 
    
  • Model에서 URL 가져오기를 사용하여 get 사용자 정의absolute_url() 방법
    class NewType(models.Model):
        caption = models.CharField(max_length=16)
    
        def get_absolute_url(self):
            """
                     URL
              :             URL,       !!!
            :return:
            """
            # return '/%s/%s' % (self._meta.db_table, self.id)
            #  
            from django.urls import reverse
            return reverse('NewType.Detail', kwargs={'nid': self.id})
    
  • 요청이 일치하는 URL 정보 가져오기: request.resolver_match
    5.include는 app에 따라 루트 규칙을 분류한다
    #     
    url(r'^web/',include('web.urls')),
    

    6. 네임스페이스
  • project.urls.py
    from django.conf.urls import url,include
     
    urlpatterns = [
        url(r'^a/', include('app01.urls', namespace='author-polls')),
        url(r'^b/', include('app01.urls', namespace='publisher-polls')),
    ]
    
  • 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')
    ]
    
  • app01.views.py
    def detail(request, pk):
        print(request.resolver_match)
        return HttpResponse(pk)
    

  • 위 정의에서 네임스페이스가 있는 URL을 정의한 다음name을 사용하여 URL을 생성할 때는 다음과 같이 해야 합니다.
    v = reverse('app01:detail', kwargs={'pk':11})
    {% url 'app01:detail' pk=12 pp=99 %}
    

    django의 루트 시스템은 다른 언어의 프레임워크와 다릅니다.django에서 요청한 URL마다 루트가 있어야 요청을 하나의view의 함수에 맡길 수 있습니다.다른 대부분의 웹 프레임워크는 같은 종류의 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의 요소는 쓰기 순서에 따라 위에서 아래로 정규 표현식을 하나씩 매칭하고 매칭에 성공하면 계속하지 않습니다.
  • URL에서 값을 캡처하려면 그 주위에 괄호 한 쌍(그룹 일치)을 놓아야 한다.
  • 각 URL에 백슬래시가 있으므로 리드 백슬래시를 추가할 필요가 없습니다.예를 들어 ^articles이지 ^/articles가 아니다.
  • 모든 정규 표현식 앞의'r'는 선택할 수 있지만 덧붙이는 것을 권장합니다.

  • 보충:
    Django settings.py 구성 파일에는 기본적으로 APPEND 가 없습니다.SLASH 매개 변수이지만 Django 기본값은 APPENDSLASH = True. 그 역할은 바로 자동으로 사이트 주소의 끝에'/'를 붙이는 것이다.
    그룹 이름 일치(?Ppattern)
    위의 예제에서는 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),
    ]						
    

    실제 응용에서 그룹 이름이 일치하는 방식을 사용하면 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 매개 변수는 영원히 문자열 형식입니다.
    보기 함수에 기본값 지정
    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 값을 사용합니다.
    보기 함수에 추가 매개 변수를 전달하기 (이해)
    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 역해석
    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 역방향 검색입니다.Django는 URL이 필요한 위치에서 URL 검색을 위한 다양한 도구를 제공합니다.
    템플릿에서: url 템플릿 탭을 사용합니다.Python 코드에서:django. 사용core.urlresolvers.reverse () 함수.Django 모델 인스턴스 처리와 관련된 상위 코드에서: get 사용absolute_url () 방법.위에서 한 무더기의 말을 했지만, 너는 아마 이해하지 못했을 것이다.(그것은 공식 문서의 딱딱한 번역이다).
    쉽게 말하면 URL 일치 규칙에 이름을 붙이고 URL 일치 모드에 이름을 붙일 수 있습니다.이렇게 하면 우리는 앞으로 URL 코드를 쓸 필요가 없고, 이름으로 현재의 URL을 호출하기만 하면 된다.
    간단한 예를 들면 다음과 같습니다.
    url(r'^home', views.home, name='home'),  
    url(r'^index/(\d*)', views.index, name='index'),  
    url(r'^book/(?P[0-9]{4})/(?P\[a-zA-Z]{2}/$)', views.book, name="book")
    

    이렇게:
  • 템플릿에서 이렇게 인용할 수 있다.
    {% url 'home' %}
    {% url 'index' 2019 %}
    {% url 'book' 2019 "sb" %}
     views         :
    
    from django.urls import reverse
    #       args
    reverse("home")
    reverse("index", args=(2018, ))
    reverse("book", kwargs={"year": 2019, "title": "sb"})
    return	redirect(reverse_url)
    
  • 파이톤 코드에서 이렇게 사용합니다:
    from django.urls import reverse
    from django.shortcuts import redirect
    
    def redirect_to_year(request):
        return redirect(reverse('year', args=(2019,)))
    
    어떤 이유로 연간 압축 파일에서 발표되는 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 %}
    

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

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

    좋은 웹페이지 즐겨찾기