django.urls
工具函式¶
reverse()
¶
如果您需要在程式碼中使用類似 url
樣板標籤的東西,Django 提供了以下函式
viewname
可以是 URL 模式名稱 或可呼叫的視圖物件。例如,給定以下 url
from news import views
path("archive/", views.archive, name="news-archive")
您可以使用以下任何一種方法來反轉 URL
# using the named URL
reverse("news-archive")
# passing a callable object
# (This is discouraged because you can't reverse namespaced views this way.)
from news import views
reverse(views.archive)
如果 URL 接受引數,您可以在 args
中傳遞它們。例如
from django.urls import reverse
def myview(request):
return HttpResponseRedirect(reverse("arch-summary", args=[1945]))
您也可以傳遞 kwargs
而不是 args
。例如
>>> reverse("admin:app_list", kwargs={"app_label": "auth"})
'/admin/auth/'
args
和 kwargs
不能同時傳遞給 reverse()
。
如果沒有找到匹配項,reverse()
會引發 NoReverseMatch
例外。
reverse()
函式可以反轉各種用於 URL 的正規表示式模式,但不是每個可能的模式。目前的主要限制是該模式不能包含使用垂直線 ("|"
) 字元的替代選項。您可以非常順利地使用此類模式來匹配傳入的 URL 並將它們發送到視圖,但您無法反轉此類模式。
current_app
引數允許您向解析器提供提示,指示目前正在執行的視圖所屬的應用程式。此 current_app
引數用於根據命名空間 URL 解析策略,將應用程式命名空間解析為特定應用程式實例上的 URL。
urlconf
引數是包含用於反轉的 URL 模式的 URLconf 模組。預設情況下,使用目前執行緒的根 URLconf。
注意
reverse()
傳回的字串已經是 url 編碼。例如
>>> reverse("cities", args=["Orléans"])
'.../Orl%C3%A9ans/'
對 reverse()
的輸出應用進一步的編碼(例如 urllib.parse.quote()
)可能會產生不良結果。
reverse_lazy()
¶
reverse() 的延遲求值版本。
- reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)¶
當您需要在載入專案的 URLConf 之前使用 URL 反轉時,此函式非常有用。此函式必要的一些常見情況是
將反轉的 URL 作為泛型基於類別的視圖的
url
屬性提供。將反轉的 URL 提供給裝飾器 (例如
django.contrib.auth.decorators.permission_required()
裝飾器的login_url
引數)。將反轉的 URL 作為函式簽名中參數的預設值提供。
resolve()
¶
resolve()
函式可用於將 URL 路徑解析為對應的視圖函式。它具有以下簽名
path
是您要解析的 URL 路徑。與 reverse()
一樣,您無需擔心 urlconf
參數。該函式會傳回一個 ResolverMatch
物件,您可以使用它來存取有關已解析 URL 的各種中繼資料。
如果 URL 無法解析,該函式會引發 Resolver404
例外 ( Http404
的子類別)。
- class ResolverMatch[原始碼]¶
- func¶
將用於服務 URL 的視圖函式
- args¶
將作為從 URL 解析的引數傳遞給視圖函式的引數。
- kwargs¶
將傳遞給視圖函式的所有關鍵字引數,即
captured_kwargs
和extra_kwargs
。
- captured_kwargs¶
將作為從 URL 解析的關鍵字引數傳遞給視圖函式的捕獲關鍵字引數。
- extra_kwargs¶
將傳遞給視圖函式的額外關鍵字引數。
- url_name¶
與 URL 匹配的 URL 模式的名稱。
- route¶
匹配 URL 模式的路由。
例如,如果
path('users/<id>/', ...)
是匹配模式,則route
將包含'users/<id>/'
。
- tried¶
在 URL 匹配或用盡可用模式之前嘗試的 URL 模式清單。
- app_name¶
與 URL 匹配的 URL 模式的應用程式命名空間。
- app_names¶
與 URL 匹配的 URL 模式的完整應用程式命名空間中的個別命名空間元件的清單。例如,如果
app_name
是'foo:bar'
,則app_names
將為['foo', 'bar']
。
- namespace¶
符合 URL 的 URL 模式的實例命名空間。
- namespaces¶
符合 URL 的 URL 模式的完整實例命名空間中個別命名空間組件的清單。例如,如果命名空間是
foo:bar
,則 namespaces 將會是['foo', 'bar']
。
- view_name¶
符合 URL 的視圖名稱,如果有的話,包含命名空間。
然後可以查詢 ResolverMatch
物件,以提供有關符合 URL 的 URL 模式的資訊。
# Resolve a URL
match = resolve("/some/path/")
# Print the URL pattern that matches the URL
print(match.url_name)
也可以將 ResolverMatch
物件指派給三元組。
func, args, kwargs = resolve("/some/path/")
resolve()
的一種可能用途是測試視圖是否會在重定向到該視圖之前引發 Http404
錯誤。
from urllib.parse import urlparse
from django.urls import resolve
from django.http import Http404, HttpResponseRedirect
def myview(request):
next = request.META.get("HTTP_REFERER", None) or "/"
response = HttpResponseRedirect(next)
# modify the request and response as required, e.g. change locale
# and set corresponding locale cookie
view, args, kwargs = resolve(urlparse(next)[2])
kwargs["request"] = request
try:
view(*args, **kwargs)
except Http404:
return HttpResponseRedirect("/")
return response
get_script_prefix()
¶
通常,您應該始終使用 reverse()
來定義應用程式內的 URL。但是,如果您的應用程式本身建構了 URL 階層的一部分,您可能偶爾需要產生 URL。在這種情況下,您需要能夠找到 Django 專案在其 Web 伺服器中的基本 URL(通常,reverse()
會為您處理此問題)。在這種情況下,您可以呼叫 get_script_prefix()
,它會傳回 Django 專案的 URL 的腳本前綴部分。如果您的 Django 專案位於其 Web 伺服器的根目錄,則它始終是 "/"
。
警告
此函式不能在請求-回應週期之外使用,因為它依賴於該週期期間初始化的值。