在Django 1.8中,urls.py是这样写的:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
在 Django 1.7 中,urls.py 如下所示:
from django.conf.urls import patterns, url
from . import views
urlpatterns = patterns('',
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(\d{4})/$', views.year_archive),
url(r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
url(r'^articles/(\d{4})/(\d{2})/(\d+)/$', views.article_detail),
)
有人可以解释为什么会有差异 - 特别是在方括号和圆括号 ([ 和 () 以及 patterns() 函数中?理论背景是什么,在实践中如何体现?
请您参考如下方法:
在 1.7 中,您可以使用字符串定义 View 的导入路径,而不是实际的 View 函数。模式的第一个参数是将用于每个后续 View 的前缀。当包含来自同一模块的多个 View 时,这减少了重复,即:
urlpatterns = patterns('myapp.views',
url(r'^articles/2003/$', 'special_case_2003'),
url(r'^articles/(\d{4})/$', 'year_archive'),
url(r'^articles/(\d{4})/(\d{2})/$', 'month_archive'),
url(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'article_detail'),
)
但是,这是没有充分理由的导入“魔法”。它可以隐藏导入错误,总体上使调试不正确的 url 模式变得更加困难。出于这个原因,在 1.8 中不推荐使用字符串而不是 View 函数,并将在 1.10 中删除。
因为 patterns() 除了将前缀添加到基于字符串的 View 导入之外没有其他用途,所以这也已被弃用并将在 1.10 中删除。
