Django:urls.py中urlpatterns的格式

24

我注意到在Django中,urls.py文件中有两种格式的urlpatterns:

urlpatterns = [
    url(...),
    url(...),
]
以及
urlpatterns = pattern('',
    url(...),
    url(...),
)

第一种格式是一组url实例的列表,而第二种则使用空字符串和多个url实例作为参数调用pattern模块。

  1. 这两种格式之间有什么区别?
  2. 第二种格式中的空字符串有什么用途?
  3. 哪种格式更推荐使用?
2个回答

35
在Django 1.8+中,urlpatterns应该只是一个url()列表。这种新的语法在1.7中也可以使用。
urlpatterns = [
    url(...),
    url(...),
]

在Django 1.8中,使用pattern的旧语法已经被弃用,并且在Django 1.10中已经移除。

urlpatterns = pattern('',
    url(...),
    url(...),
)

旧语法中,您可以提供前缀。在文档中给出的示例为:

urlpatterns = patterns('news.views',
    url(r'^articles/([0-9]{4})/$', 'year_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'article_detail'),
)

然而,现在已经不推荐使用字符串参数作为视图的参数了。您应该提供可调用对象。


8
根据文档patterns 是:

一个函数,它接受一个前缀和任意数量的URL模式,并以Django所需的格式返回URL模式列表。

patterns() 的第一个参数是一个字符串 prefix

文档还提供了为什么要使用它的示例:

from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'^articles/([0-9]{4})/$', 'news.views.year_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'news.views.month_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'news.views.article_detail'),
)

In this example, each view has a common prefix – 'news.views'. Instead of typing that out for each entry in urlpatterns, you can use the first argument to the patterns() function to specify a prefix to apply to each view function.

With this in mind, the above example can be written more concisely as:

from django.conf.urls import patterns, url

urlpatterns = patterns('news.views',
    url(r'^articles/([0-9]{4})/$', 'year_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'article_detail'),
)

然而,请注意这个函数已经被弃用:

自1.8版本起已弃用:

urlpatterns 应该是一个简单的 django.conf.urls.url() 实例列表。

请注意,其原因解释包括(显然有充分的理由):

因此,patterns() 没有什么作用,并且在教授新用户时是一个负担(回答新手的问题:“为什么我需要将这个空字符串作为 patterns() 的第一个参数?”)。


4
值得注意的是,在Django 1.10中,将不再支持使用字符串引用视图函数和patterns()函数。为了避免弃用警告,请改用普通列表。 - knbk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接