django.core.urlresolvers utility functions

reverse()

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

reverse(viewname[, urlconf=None, args=None, kwargs=None, current_app=None])[source]

viewname可以是包含视图对象,URL pattern name或可调用视图对象的Python路径的字符串。例如,给定以下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
from news import views
reverse(views.archive)

如果网址接受参数,您可以在args中传递参数。例如:

from django.core.urlresolvers 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参数允许您向解析器提供指示当前正在执行的视图所属的应用程序的提示。根据namespaced URL resolution strategy,此current_app参数用作将应用程序命名空间解析为特定应用程序实例上的URL的提示。

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

从1.8版开始弃用:可以使用Python路径进行反转,例如reverse('news.views.archive')已被弃用。

确保您的视图都正确。

作为确定哪些URL名称映射到哪些模式的一部分,reverse()函数必须导入所有URLconf文件并检查每个视图的名称。这涉及导入每个视图函数。如果在导入任何视图函数时出现任何错误,则会导致reverse()引发错误,即使该视图函数不是您正在尝试的扭转。

请确保您在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反转时非常有用。一些常见的需要此功能的情况是:

resolve()

resolve()函数可用于解析到相应视图函数的URL路径。它有以下签名:

resolve(path, urlconf=None)[source]

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

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

class ResolverMatch[source]
func

将用于服务URL的视图函数

args

这将被传递到浏览功能,如从URL解析的参数。

kwargs

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

url_name

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

app_name

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

namespace

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

namespaces

与URL匹配的URL模式的完整实例命名空间中的单个命名空间组件的列表。即,如果命名空间是foo:bar,则命名空间将是['foo', 'bar'] t2 >。

view_name

与URL匹配的视图的名称,包括命名空间(如果有的话)。

然后可以询问ResolverMatch对象,以提供有关与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 django.core.urlresolvers 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()[source]

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