Django4.0 URL調(diào)度器-URL的反向解析

2022-03-16 17:42 更新

在 Django 項目中,一個常見需求是獲取最終形式的 URL,比如用于嵌入生成的內(nèi)容中(視圖和資源網(wǎng)址,給用戶展示網(wǎng)址等)或用戶服務(wù)器端的導(dǎo)航處理(重定向等)。

強(qiáng)烈建議不要硬編碼 URL(這是一個費力、不能擴(kuò)展、容易出錯的主意)。同樣危險的是設(shè)計臨時機(jī)制來生成的 URL 與URLconf描述的設(shè)計的URL一樣,這會導(dǎo)致 URL 隨著時間的推移變得過時。

換句話說,需要的是 DRY 機(jī)制。除其他優(yōu)勢外,它還允許 URL 設(shè)計自動更新,而不必遍歷所有項目代碼來搜索和替換過時的 URL 。

我們用來獲取 URL 的首要信息是負(fù)責(zé)處理它的視圖的標(biāo)識(例如名稱)。必須參與查找正確網(wǎng)址的其他信息是視圖參數(shù)的類型(位置、關(guān)鍵字)和值。

Django 提供了一個解決方案,使得 URL 映射是 URL 設(shè)計唯一的倉庫。你使用 URLconf 來填充它,然后可以雙向使用它:

  • 從用戶/瀏覽器請求的 URL 開始,它調(diào)用正確的Django視圖,并從 URL 中提取它的參數(shù)需要的值。
  • 從相應(yīng)的 Django 視圖標(biāo)識以及要傳遞給它的參數(shù)來獲取相關(guān)聯(lián)的 URL 。

Django 提供執(zhí)行反轉(zhuǎn) URL 的工具,這些工具與需要 URL 的不同層匹配:

  • 在模板里:使用 url 模板標(biāo)簽。
  • 在 Python 編碼:使用 ?reverse()? 函數(shù)。
  • 在與 Django 模型實例的 URL 處理相關(guān)的高級代碼中: ?get_absolute_url()? 方法。

例如:

from django.urls import path

from . import views

urlpatterns = [
    #...
    path('articles/<int:year>/', views.year_archive, name='news-year-archive'),
    #...
]

根據(jù)這個設(shè)計,與 ?year nnnn? 相對應(yīng)的 URL 是 ?/articles/<nnnn>/? 。

你可以使用以下方式在模板代碼中來獲取它們:

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

或在Python代碼中:

from django.http import HttpResponseRedirect
from django.urls import reverse

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

因為某些原因,如果決定改變每年已發(fā)布的文章存檔內(nèi)容的 URL ,你只需要改變 URLconf 中的條目即可。

在一些視圖具有一般性質(zhì)的場景下,URLs 和視圖存在多對一關(guān)系。對于這些情況,當(dāng)反轉(zhuǎn) URLs 時,視圖名并不是一個足夠好的標(biāo)識符。閱讀下一節(jié)來了解 Django 如何解決這一問題。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號