django.urls
效用函数¶reverse()
¶如果您需要使用类似于 url
在代码中,django提供了以下功能:
viewname
可以是 URL pattern name 或可调用的视图对象。例如,假设 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
根据 namespaced URL resolution strategy .
这个 urlconf
参数是包含用于反转的URL模式的urlconf模块。默认情况下,使用当前线程的根urlconf。
备注
返回的字符串 reverse()
已经是 urlquoted 。例如:
>>> reverse("cities", args=["Orléans"])
'.../Orl%C3%A9ans/'
应用进一步的编码(例如 urllib.parse.quote()
)到的输出 reverse()
可能会产生不良结果。
reverse_lazy()
¶延迟评估的版本 reverse() .
当您需要在加载项目的urlconf之前使用URL反转时,它非常有用。一些需要此功能的常见情况是:
提供一个反向的URL作为 url
基于类的通用视图的属性。
为修饰符提供反向的URL(例如 login_url
的参数 django.contrib.auth.decorators.permission_required()
装饰师)
提供一个反向的URL作为函数签名中参数的默认值。
resolve()
¶这个 resolve()
函数可用于将URL路径解析为相应的视图函数。签字如下:
path
是要解析的URL路径。和一样 reverse()
你不必担心 urlconf
参数。函数返回 ResolverMatch
对象,该对象允许您访问有关已解析URL的各种元数据。
如果URL未解析,则函数将引发 Resolver404
例外(子类 Http404
)
将用于为URL提供服务的视图函数
从URL解析的将传递给视图函数的参数。
将传递给view函数的所有关键字参数,即 captured_kwargs
和 extra_kwargs
。
从URL解析的、将被传递给view函数的捕获的关键字参数。
将传递给view函数的其他关键字参数。
与URL匹配的URL模式的名称。
匹配的URL模式的路由。
例如,如果 path('users/<id>/', ...)
是匹配的模式, route
将包含 'users/<id>/'
.
在URL匹配一个或用尽可用模式之前尝试的URL模式列表。
与URL匹配的URL模式的应用程序命名空间。
与URL匹配的URL模式的完整应用程序命名空间中单个命名空间组件的列表。例如,如果 app_name
是 'foo:bar'
然后 app_names
将 ['foo', 'bar']
.
与URL匹配的URL模式的实例命名空间。
与URL匹配的URL模式的完整实例命名空间中单个命名空间组件的列表。例如,如果名称空间是 foo:bar
,则命名空间将 ['foo', 'bar']
.
与URL匹配的视图的名称,包括命名空间(如果有)。
A ResolverMatch
然后可以询问对象,以提供有关与URL匹配的URL模式的信息::
# Resolve a URL
match = resolve("/some/path/")
# Print the URL pattern that matches the URL
print(match.url_name)
A ResolverMatch
对象也可以分配给三个:
func, args, kwargs = resolve("/some/path/")
一种可能的用途 resolve()
将测试一个视图是否会引发 Http404
重定向到它之前出错::
from urllib.parse import urlsplit
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(urlsplit(next).path)
kwargs["request"] = request
try:
view(*args, **kwargs)
except Http404:
return HttpResponseRedirect("/")
return response
get_script_prefix()
¶通常,您应该始终使用 reverse()
若要在应用程序中定义URL,请执行以下操作。但是,如果您的应用程序本身构造了URL层次结构的一部分,您可能偶尔需要生成URL。在这种情况下,您需要能够在其Web服务器中找到Django项目的基本URL(通常, reverse()
为您处理这件事)。在这种情况下,您可以调用 get_script_prefix()
,它将返回Django项目的URL的脚本前缀部分。如果您的Django项目位于其Web服务器的根目录下,则始终为 "/"
。
警告
此函数 cannot 在请求-响应周期之外使用,因为它依赖于在该周期内初始化的值。
7月 22, 2024