Maison  >  Article  >  développement back-end  >  Explication détaillée du système de routage dans Django (exemple de code)

Explication détaillée du système de routage dans Django (exemple de code)

不言
不言avant
2018-10-12 15:48:211876parcourir

Cet article vous apporte une explication détaillée (exemple de code) du système de routage dans Django. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Le système de routage de Django

La configuration des URL (URL.conf) est comme le répertoire du site web supporté par Django. Son essence est l'URL et les fonctions à appeler. pour l'URL. Table de mappage entre les fonctions d'affichage.

C'est ainsi que nous indiquons à Django quelle fonction exécuter lorsqu'il rencontre quelle URL.

Configuration d'URLconf

Format de base :

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

Exemple :

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),
}

Description du paramètre :

Expression régulière : une chaîne d'expression régulière

views : un objet appelable, généralement une fonction de vue

Paramètres : paramètres facultatifs par défaut (forme de dictionnaire ) à passer à la fonction view

Alias ​​: un paramètre de nom facultatif

Remarque :

Le système de routage dans Django version 2.0 s'écrit comme suit : (document officiel) :

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),
]

re_path en version 2.0 et re_path en version 1.11 L'url s'utilise de la même manière

Explication détaillée des expressions régulières

Configuration de base

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),
]

Remarques :

1. Les éléments des urlpatterns correspondent aux expressions régulières une par une de haut en bas dans l'ordre d'écriture. Une fois la correspondance réussie, elle ne continuera pas.

2. Pour capturer une valeur de l'URL, placez simplement une paire de parenthèses autour d'elle (correspondance de groupe

3 Il n'est pas nécessaire d'ajouter une barre oblique inverse2, car chaque URL a, par exemple,). il devrait s'agir de ^articles au lieu de ^/articles.

4. Le « r » devant chaque expression régulière est facultatif mais recommandé.

Instructions supplémentaires :# S'il faut activer l'élément de configuration APPEND_SLASH=True qui ne saute pas à un chemin avec / après l'adresse d'accès à l'URL # Sa fonction est d'ajouter '/' à la fin de l'URL .


Le l'effet est :

Nous définissons urls.py :

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

Visitez http://www.example.com/blog, le L'URL sera automatiquement convertie en http://www.example/com/blog/ par défaut.

Si APPEND_SLASH-False est défini dans settings.py, lorsque nous demandons http://www.example.com/blog, nous serons informés que la page est introuvable.

Groupe Correspondances nommées

L'exemple ci-dessus utilise une simple correspondance groupée d'expression régulière (via des parenthèses) pour capturer les valeurs de l'URL et les transmettre à la vue en tant qu'arguments de position

Dans une utilisation plus avancée. Dans , vous pouvez utiliser des groupes d'expressions régulières correspondantes nommées groupées pour capturer les valeurs dans l'URL et les transmettre à la vue en tant qu'arguments de mot-clé

Dans les expressions régulières de Python, la syntaxe des expressions régulières nommées groupées est (? P8a11bc632ea32a57b3e3693c7987c420pattern), où name est le nom du groupe et pattern est le modèle à correspondre.

Voici une réécriture de l'URLconf ci-dessus en utilisant des groupes nommés :

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),
]

Cette implémentation est exactement la même que l'exemple précédent, avec une légère torsion La différence : la valeur capturée est transmise à la fonction d'affichage en tant qu'argument de mot-clé plutôt qu'en tant qu'argument de position.

Par exemple, appeler la fonction view pour l'URL /articles/2017/12/ équivaut à appeler la fonction view de la manière suivante :

views.month_archive(request, year="2017", month="12")

Dans l'application réelle, l'utilisation de la correspondance de noms groupés peut rendre votre configuration d'URL plus claire et moins sujette aux erreurs d'ordre des paramètres, mais certains développeurs pensent que la syntaxe des groupes de noms groupés est trop moche et lourde.

Quant à celui que vous devez utiliser, vous pouvez décider en fonction de vos propres préférences.

Où URLconf correspond

URLconf recherche l'URL demandée, en la traitant comme une chaîne Python ordinaire. Exclut les paramètres GET et POST et les noms de domaine.

Par exemple, dans une requête pour http://www.example.com/myapp/, l'URLconf recherchera /myapp/

sur http://www.example.com /myapp/?page =3 Lors de la requête, l'URLconf recherchera toujours /myapp/

URLconf ne vérifie pas la méthode demandée. En d’autres termes, toutes les méthodes de requête – POST, GET, HEAD, etc. pour la même URL – seront acheminées vers la même fonction.

Les paramètres capturés sont toujours des chaînes

Chaque paramètre capturé dans l'URLconf est transmis à la vue sous la forme d'une chaîne Python ordinaire, quelle que soit la méthode de correspondance d'expression régulière utilisée. Par exemple, dans la ligne suivante d'URLconf :

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

Le paramètre year passé à la fonction d'affichage vues.year_archive() est toujours un type de chaîne.

Valeur par défaut spécifiée dans la fonction d'affichage

# 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

Dans l'exemple ci-dessus, les deux modèles d'URL pointent vers la même vue - vues .page - mais le premier modèle ne capture rien de l'URL.

Si le premier modèle correspond, la fonction page() utilisera son paramètre par défaut num="1". Si le deuxième modèle correspond, page() utilisera la valeur num capturée par l'expression régulière.

inclure d'autres 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文件
]

Passer des paramètres supplémentaires pour afficher les fonctions (comprendre)

URLconfs a un hook qui vous permet de transmettre un dictionnaire Python comme argument supplémentaire à la fonction d'affichage.

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文章教程栏目!!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer