>  기사  >  백엔드 개발  >  Django의 라우팅 시스템에 대한 자세한 설명(코드 예)

Django의 라우팅 시스템에 대한 자세한 설명(코드 예)

不言
不言앞으로
2018-10-12 15:48:211915검색

이 기사는 Django의 라우팅 시스템에 대한 자세한 설명(코드 예제)을 제공합니다. 이는 특정 참고 가치가 있으므로 도움이 될 수 있습니다.

Django의 라우팅 시스템

URL 구성(URL.conf)은 Django가 지원하는 웹사이트의 디렉토리와 같습니다. 그 본질은 URL과 해당 URL에 대해 호출되는 뷰 함수 간의 매핑 테이블입니다.

우리는 이런 식으로 어떤 URL을 만났을 때 어떤 함수를 실행할지 Django에 알려줍니다.

기본 형식:

from django.conf.urls import url
urlpatterns = {
        url(正则表达式,views视图,参数,别名),
}

예:

from django.conf.urls import
from . import views
urlparterns = {
        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_detall),
}

매개변수 설명:

정규 표현식: 정규 표현식 문자열

views: 호출 가능한 객체, 일반적으로 뷰 함수

매개변수: 뷰 함수에 전달될 선택적 기본 매개변수(사전 형식)

별칭: 선택적 이름 매개변수

참고:

Django 버전 2.0의 라우팅 시스템은 다음과 같이 작성되었습니다. (공식 문서):

from django.urls import path,re_path

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path(&#39;articles/<int:year>/&#39;, views.year_archive),
    path(&#39;articles/<int:year>/<int:month>/&#39;, views.month_archive),
    path(&#39;articles/<int:year>/<int:month>/<slug:slug>/&#39;, views.article_detail),
]

버전 2.0의 re_path와 버전 1.11의 url은 사용법이 동일합니다.

regular에 대한 자세한 설명 표현

기본 구성

from django.conf.urls import url
from . import views
urlpatterns = [
        url(r&#39;^articles/2003/$&#39;,views.special_case_2003),
        url(r&#39;^articles/([0-9]{4})/$&#39;,views.year_archive),
        url(r&#39;^article/([0-9]{4})/([0-9]{2})/$&#39;,views.month_archive),
        url(r&#39;^article/([0-9]{4})/([0-9]{2})/([0-9]+)&#39;,views.article_detail),
]

참고:

1 일치가 성공하면 urlpatterns의 요소는 위에서 아래로 하나씩 정규식과 일치합니다.

2. URL에서 값을 캡처하려면 그 주위에 괄호를 두십시오(그룹 일치).

3. 예를 들어 모든 URL에는 백슬래시를 추가할 필요가 없습니다. , ^/articles 대신 ^articles여야 합니다.

4. 각 정규 표현식 앞의 'r'은 선택 사항이지만 추가하는 것이 좋습니다.

추가 설명:

# 구성 활성화 여부 item APPEND_SLASH=True는 URL 액세스 주소 뒤에 /가 있는 경로로 이동하지 않습니다. # 해당 기능은 URL 끝에 '/'를 추가하는 것입니다.효과는 다음과 같습니다.


urls.py를 정의했습니다.

from django.conf.urls import url
from app01 import views
urlpatterns = [
        url(r&#39;^blog/$&#39;,views.blog)
]

http://www.example.com/blog에 접속하면 기본적으로 URL이 http://www.example/com/blog/로 자동 변환됩니다.

settings.py에 APPEND_SLASH-False가 설정된 경우 http://www.example.com/blog를 요청하면 페이지를 찾을 수 없다는 메시지가 표시됩니다.

그룹 이름 일치

위의 예를 사용하세요. 간단한 정규식 그룹화 일치 항목(괄호를 통해)을 사용하여 URL의 값을 캡처하고 이를 위치 인수로 뷰에 전달할 수 있습니다.

더 고급 사용법에서는 명명된 일치 정규식 그룹을 사용하여 URL의 값을 캡처할 수 있습니다. 값은 키워드 인수 형식으로 뷰에 전달됩니다.

Python의 정규 표현식에서 그룹 이름이 지정된 정규 표현식의 구문은 (?Ppattern)입니다. 여기서 name은 그룹의 이름이고 패턴은 모드를 일치시킵니다.

다음은 명명된 그룹을 사용하여 위의 URLconf를 다시 작성한 것입니다.

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r&#39;^articles/2003/$&#39;, views.special_case_2003),
    url(r&#39;^articles/(?P<year>[0-9]{4})/$&#39;, views.year_archive),
    url(r&#39;^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$&#39;, views.month_archive),
    url(r&#39;^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$&#39;, 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에 대한 요청에서 /myapp/

을 찾습니다. =3, URLconf는 계속해서 찾습니다. /myapp/

URLconf가 요청된 방법을 확인하지 않습니다. 즉, 동일한 URL에 대한 모든 요청 메소드(POST, GET, HEAD 등)가 동일한 함수로 라우팅됩니다.

캡처된 매개변수는 항상 문자열입니다.

URLconf에 캡처된 모든 매개변수는 정규식에서 사용되는 일치 방법에 관계없이 일반 Python 문자열로 뷰에 전달됩니다. 예를 들어 URLconf의 다음 줄에서는

url(r&#39;^articles/(?P<year>[0-9]{4})/$&#39;, views.year_archive),

view 함수 views.year_archive()에 전달된 연도 매개변수는 항상 문자열 유형입니다.

보기 함수에 지정된 기본값

# urls.py中
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r&#39;^blog/$&#39;, views.page),
    url(r&#39;^blog/page(?P<num>[0-9]+)/$&#39;, views.page),
]# views.py中,可以为num指定默认值def page(request, num="1"):    pass

위의 예에서 두 URL 패턴은 동일한 보기인 views.page를 가리키지만 첫 번째 패턴은 URL에서 아무 것도 캡처하지 않습니다.

첫 번째 패턴이 일치하면 page() 함수는 기본 매개변수 num="1"을 사용합니다. 두 번째 패턴이 일치하면 page()는 정규 표현식에서 캡처한 num 값을 사용합니다.

다른 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&#39;^admin/&#39;, admin.site.urls),
   url(r&#39;^blog/&#39;, include(&#39;blog.urls&#39;)),  # 可以包含其他的URLconfs文件
]

함수를 보기 위해 추가 매개변수 전달(이해)

URLconfs에는 함수를 보기 위한 추가 매개변수로 Python 사전을 전달할 수 있는 후크가 있습니다.

django.conf.urls.url() 可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

例如:

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r&#39;^blog/(?P<year>[0-9]{4})/$&#39;, views.year_archive, {&#39;foo&#39;: &#39;bar&#39;}),
]

在这个例子中,对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')。
当传递额外参数的字典中的参数和URL中捕获值的命名关键字参数同名时,函数调用时将使用的是字典中的参数,而不是URL中捕获的参数。

命名URL和URL反向解析

在使用Django 项目时,一个常见的需求是获得URL的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。
人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
换句话讲,需要的是一个DRY 机制。除了其它有点,它还允许设计的URL 可以自动更新而不用遍历项目的源代码来搜索并替换过期的URL。
获取一个URL 最开始想到的信息是处理它视图的标识(例如名字),查找正确的URL 的其它必要的信息有视图参数的类型(位置参数、关键字参数)和值。
Django 提供一个办法是让URL 映射是URL 设计唯一的地方。你填充你的URLconf,然后可以双向使用它:

根据用户/浏览器发起的URL 请求,它调用正确的Django 视图,并从URL 中提取它的参数需要的值。

根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。

第一种方式是我们在前面的章节中一直讨论的用法。第二种方式叫做反向解析URL、反向URL 匹配、反向URL 查询或者简单的URL 反查。
在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:

在模板中:使用url模板标签。

在Python 代码中:使用django.core.urlresolvers.reverse() 函数。

在更高层的与处理Django 模型实例相关的代码中:使用get_absolute_url() 方法。

上面说了一大堆,你可能并没有看懂。(那是官方文档的生硬翻译)。

咱们简单来说就是可以给我们的URL匹配规则起个名字,一个URL匹配模式起一个名字。

这样我们以后就不需要写死URL代码了,只需要通过名字来调用当前的URL。

举个简单的例子:

url(r&#39;^home&#39;, views.home, name=&#39;home&#39;),  # 给我的url匹配模式起名为 home
url(r&#39;^index/(\d*)&#39;, views.index, name=&#39;index&#39;),  # 给我的url匹配模式起名为index

这样:

在模板里面可以这样引用:

{% url &#39;home&#39; %}

在views函数中可以这样引用:

from django.urls import reverse
reverse("index", args=("2018", ))

例子:

考虑下面的URLconf:

from django.conf.urls import url
from . import views
urlpatterns = [
    # ...
    url(r&#39;^articles/([0-9]{4})/$&#39;, views.year_archive, name=&#39;news-year-archive&#39;),
    # ...
]

根据这里的设计,某一年nnnn对应的归档的URL是/articles/nnnn/。

你可以在模板的代码中使用下面的方法获得它们:

<a href="{% url &#39;news-year-archive&#39; 2012 %}">2012 Archive</a>
<ul>
{% for yearvar in year_list %}
<li><a href="{% url &#39;news-year-archive&#39; yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

在Python 代码中,这样使用:

from django.urls import reverse
from django.shortcuts import redirect

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return redirect(reverse(&#39;news-year-archive&#39;, args=(year,)))

如果出于某种原因决定按年归档文章发布的URL应该调整一下,那么你将只需要修改URLconf 中的内容。

在某些场景中,一个视图是通用的,所以在URL 和视图之间存在多对一的关系。对于这些情况,当反查URL 时,只有视图的名字还不够。

注意:

为了完成上面例子中的URL 反查,你将需要使用命名的URL 模式。URL 的名称使用的字符串可以包含任何你喜欢的字符。不只限制在合法的Python 名称。

当命名你的URL 模式时,请确保使用的名称不会与其它应用中名称冲突。如果你的URL 模式叫做comment,而另外一个应用中也有一个同样的名称,当你在模板中使用这个名称的时候不能保证将插入哪个URL。

在URL 名称中加上一个前缀,比如应用的名称,将减少冲突的可能。我们建议使用myapp-comment 而不是comment。

命名空间模式

即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。

举个例子:

project中的urls.py

from django.conf.urls import url, include
urlpatterns = [
    url(r&#39;^app01/&#39;, include(&#39;app01.urls&#39;, namespace=&#39;app01&#39;)),
    url(r&#39;^app02/&#39;, include(&#39;app02.urls&#39;, namespace=&#39;app02&#39;)),
]

app01中的urls.py

from django.conf.urls import url
from app01 import views

app_name = &#39;app01&#39;urlpatterns = [
    url(r&#39;^(?P<pk>\d+)/$&#39;, views.detail, name=&#39;detail&#39;)
]

app02中的urls.py

from django.conf.urls import url
from app02 import views
app_name = &#39;app02&#39;urlpatterns = [
    url(r&#39;^(?P<pk>\d+)/$&#39;, views.detail, name=&#39;detail&#39;)
]

现在,我的两个app中 url名称重复了,我反转URL的时候就可以通过命名空间的名称得到我当前的URL。

语法:

'命名空间名称:URL名称'

模板中使用:

{% url &#39;app01:detail&#39; pk=12 pp=99 %}

views中的函数中使用

v = reverse('app01:detail', kwargs={'pk':11})

 这样即使app中URL的命名相同,我也可以反转得到正确的URL了。

以上就是本篇文章的全部内容,关于python更多精彩内容大家可以关注php中文网的Python视频教程python文章教程栏目!!!

위 내용은 Django의 라우팅 시스템에 대한 자세한 설명(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제