Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung des Routing-Systems in Django (Codebeispiel)
Dieser Artikel enthält eine detaillierte Erklärung (Codebeispiel) des Routing-Systems in Django. Ich hoffe, dass er für Freunde hilfreich ist.
Djangos Routing-System
URL-Konfiguration (URL.conf) ist wie das Verzeichnis der von Django unterstützten Website. Sein Wesen besteht aus der URL und den aufzurufenden Funktionen für die URL. Zuordnungstabelle zwischen Ansichtsfunktionen.
So teilen wir Django mit, welche Funktion ausgeführt werden soll, wenn auf welche URL gestoßen wird.
URLconf-Konfiguration
Grundformat:
from django.conf.urls import url urlpatterns = { url(正则表达式,views视图,参数,别名), }
Beispiel:
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), }
Parameterbeschreibung:
Regulärer Ausdruck: eine reguläre Ausdruckszeichenfolge
Ansichten: ein aufrufbares Objekt, normalerweise eine Ansichtsfunktion
Parameter: Optionale Standardparameter (Wörterbuchform), die übergeben werden zur Ansichtsfunktion
Alias: Ein optionaler Namensparameter
Hinweis:
Das Routing-System in Django Version 2.0 ist wie folgt geschrieben: (offiziell Dokument):
from django.urls import path,re_path urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), ]
Der re_path von Version 2.0 wird genauso verwendet wie die URL von Version 1.11.
Detaillierte Erklärung von reguläre Ausdrücke
Grundkonfiguration
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'^article/([0-9]{4})/([0-9]{2})/$',views.month_archive), url(r'^article/([0-9]{4})/([0-9]{2})/([0-9]+)',views.article_detail), ]
Hinweise:
1. Die Elemente in URL-Mustern stimmen nacheinander von oben nach unten in der Schreibreihenfolge überein. Sobald die Übereinstimmung erfolgreich ist, wird sie nicht fortgesetzt.
2 Wenn ein Wert erfasst wird URL, setzen Sie einfach ein Paar Klammern (Gruppierungsübereinstimmung)3. Es ist nicht erforderlich, einen führenden Backslash2 hinzuzufügen, da jede URL einen haben sollte, z. B. ^articles statt ^/articles.
4. Das „r“ vor jedem regulären Ausdruck ist optional, es wird jedoch empfohlen, es hinzuzufügen.
Ergänzende Anweisungen:# Ob aktiviert werden soll das Konfigurationselement APPEND_SLASH=True, das nicht zu einem Pfad mit / nach der URL-Zugriffsadresse springt # Seine Funktion besteht darin, „/“ am Ende der URL hinzuzufügen.
Es Der Effekt ist:Wir definieren urls.py:
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^blog/$',views.blog) ]
Beim Zugriff auf http://www.example.com/blog wird standardmäßig die URL automatisch in konvertiert http://www.example/com/blog/.
Wenn APPEND_SLASH-False in „settings.py“ festgelegt ist, erhalten wir beim Anfordern von http://www.example.com/blog die Meldung, dass die Seite nicht gefunden werden kann.
Gruppe Benannte Übereinstimmungen
Im obigen Beispiel wird ein einfacher gruppierter regulärer Ausdruck (über Klammern) verwendet, um Werte aus der URL zu erfassen und sie als Positionsargumente an die Ansicht zu übergeben.
In einer fortgeschritteneren Verwendung In können Sie gruppierte benannte übereinstimmende reguläre Ausdrucksgruppen verwenden, um Werte in der URL zu erfassen und sie als Schlüsselwortargumente an die Ansicht zu übergeben.
In den regulären Ausdrücken von Python lautet die Syntax für gruppierte benannte reguläre Ausdrücke (? P8a11bc632ea32a57b3e3693c7987c420pattern), wobei Name der Name der Gruppe und Muster das zu vergleichende Muster ist.
Hier ist eine Umschreibung der obigen URLconf unter Verwendung benannter Gruppen:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), ]
Diese Implementierung ist genau die gleiche wie das vorherige Beispiel, mit einer Feiner Unterschied: Der erfasste Wert wird als Schlüsselwortargument und nicht als Positionsargument an die Ansichtsfunktion übergeben.
Zum Beispiel entspricht der Aufruf der Ansichtsfunktion für die URL /articles/2017/12/ dem Aufruf der Ansichtsfunktion auf folgende Weise:
views.month_archive(request, year="2017", month="12")
In tatsächlichen Anwendungen kann die Verwendung des gruppierten Namensabgleichs dazu führen, dass Ihre URLconf klarer und weniger anfällig für Fehler in der Parameterreihenfolge wird. Einige Entwickler sind jedoch der Meinung, dass die Syntax der gruppierten Namensgruppe zu hässlich und umständlich ist.
Welches Sie verwenden sollten, können Sie nach Ihren eigenen Vorlieben entscheiden.
Wobei URLconf zutrifft
URLconf sucht nach der angeforderten URL und behandelt sie als gewöhnlichen Python-String. Ausgeschlossen sind GET- und POST-Parameter und Domänennamen.
Zum Beispiel sucht die URLconf in einer Anfrage für http://www.example.com/myapp/ nach /myapp/
bei http://www.example.com /myapp/?page =3 Während der Anfrage sucht die URLconf weiterhin nach /myapp/
URLconf überprüft die angeforderte Methode nicht. Mit anderen Worten: Alle Anforderungsmethoden – POST, GET, HEAD usw. für dieselbe URL – werden an dieselbe Funktion weitergeleitet.
Erfasste Parameter sind immer Zeichenfolgen
Jeder in der URLconf erfasste Parameter wird als gewöhnlicher Python-String an die Ansicht übergeben, unabhängig von der verwendeten Methode zum Abgleich regulärer Ausdrücke. Beispielsweise in der folgenden Zeile von URLconf:
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
Der an die Ansichtsfunktion „views.year_archive()“ übergebene Jahresparameter ist immer ein Zeichenfolgentyp.
Angegebener Standardwert in der Ansichtsfunktion
# urls.py中 from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ]# views.py中,可以为num指定默认值def page(request, num="1"): pass
Im obigen Beispiel verweisen beide URL-Muster auf dieselbe Ansicht – views.page – Aber Das erste Muster erfasst nichts von der URL.
Wenn das erste Muster übereinstimmt, verwendet die Funktion page() ihren Standardparameter num="1". Wenn das zweite Muster übereinstimmt, verwendet page() den vom regulären Ausdruck erfassten Wert.
Andere URLconfs einschließen#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文件 ]Zusätzliche Parameter übergeben, um Funktionen anzuzeigen (zu verstehen)
URLconfs verfügt über einen Hook, mit dem Sie ein Python-Wörterbuch als zusätzliches Argument an die Ansichtsfunktion übergeben können.
django.conf.urls.url() 可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。
例如:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}), ]
在这个例子中,对于/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'^home', views.home, name='home'), # 给我的url匹配模式起名为 home url(r'^index/(\d*)', views.index, name='index'), # 给我的url匹配模式起名为index
这样:
在模板里面可以这样引用:
{% url 'home' %}
在views函数中可以这样引用:
from django.urls import reverse 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'), # ... ]
根据这里的设计,某一年nnnn对应的归档的URL是/articles/nnnn/。
你可以在模板的代码中使用下面的方法获得它们:
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a> <ul> {% for yearvar in year_list %} <li><a href="{% url 'news-year-archive' 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('news-year-archive', 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'^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<pk>\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<pk>\d+)/$', views.detail, name='detail') ]
现在,我的两个app中 url名称重复了,我反转URL的时候就可以通过命名空间的名称得到我当前的URL。
语法:
'命名空间名称:URL名称'
模板中使用:
{% url 'app01:detail' pk=12 pp=99 %}
views中的函数中使用
v = reverse('app01:detail', kwargs={'pk':11})
这样即使app中URL的命名相同,我也可以反转得到正确的URL了。
以上就是本篇文章的全部内容,关于python更多精彩内容大家可以关注php中文网的Python视频教程和python文章教程栏目!!!
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Routing-Systems in Django (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!