Skip to main content

django.urls 实用函数

1.10 版后已移除: 在旧版本中,这些功能位于 django.core.urlresolvers 中。从旧位置导入将继续工作,直到Django 2.0。

reverse()

如果您需要在代码中使用类似于 url 模板标记的内容,Django提供以下功能:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)

viewname 可以是 网址格式名称 或可调用的视图对象。例如,给定以下 url:

from news import views

url(r'^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/'

argskwargs 不能同时传递到 reverse()

如果不能匹配,则 reverse() 引发 NoReverseMatch 异常。

reverse() 函数可以反转URL的大量正则表达式模式,但不是每一个可能的。目前的主要限制是模式不能包含使用垂直条("|")字符的替代选择。你可以很高兴地使用这样的模式来匹配传入的URL并将它们发送到视图,但是你不能反转这种模式。

current_app 参数允许您向解析器提供指示当前执行的视图所属的应用程序的提示。根据 命名空间的URL解析策略,此 current_app 参数用作将应用程序命名空间解析为特定应用程序实例上的URL的提示。

urlconf 参数是包含要用于反转的URL模式的URLconf模块。默认情况下,使用当前线程的根URLconf。

注解

reverse() 返回的字符串已经是 urlquoted。例如:

>>> reverse('cities', args=['Orléans'])
'.../Orl%C3%A9ans/'

将进一步的编码(例如 urlquote()urllib.quote)应用于 reverse() 的输出可能产生不期望的结果。

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路径。它有以下签名:

resolve(path, urlconf=None)

path 是您要解析的网址路径。与 reverse() 一样,您不需要担心 urlconf 参数。该函数返回一个 ResolverMatch 对象,允许您访问已解析URL的各种元数据。

如果URL不解析,该函数引发 Resolver404 异常(Http404 的子类)。

class ResolverMatch
func

将用于提供网址的视图函数

args

将传递给视图函数的参数,从URL解析。

kwargs

将被传递到视图函数的关键字参数,从URL解析。

url_name

与网址匹配的网址格式的名称。

app_name

与URL匹配的URL模式的应用程序命名空间。

app_names
New in Django 1.9.

与URL匹配的URL模式的完整应用程序命名空间中的单个命名空间组件的列表。例如,如果 app_name'foo:bar',则 app_names 将是 ['foo', 'bar']

namespace

与URL匹配的URL模式的实例命名空间。

namespaces

与URL匹配的URL模式的完整实例命名空间中的单个命名空间组件的列表。即如果命名空间是 foo:bar,则命名空间将是 ['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 django.urls import resolve
from django.http import HttpResponseRedirect, Http404
from django.utils.six.moves.urllib.parse import urlparse

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()

get_script_prefix()

通常,应始终使用 reverse() 在应用程序中定义URL。但是,如果您的应用程序构成部分URL层次结构本身,您可能偶尔需要生成URL。在这种情况下,您需要能够在其Web服务器中找到Django项目的基本URL(通常,reverse() 会为您处理这个URL)。在这种情况下,您可以调用 get_script_prefix(),它将返回Django项目的URL的脚本前缀部分。如果你的Django项目在它的web服务器的根目录,这总是 "/"