为什么在Django 1.8和1.7中有不同的urls.py?

时间:2015-10-04 16:11:38

标签: python django

在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()函数?什么是理论背景,以及它实际上是如何表现出来的?

2 个答案:

答案 0 :(得分:4)

在1.7中,您可以使用定义视图导入路径的字符串,而不是实际的视图函数。模式的第一个参数是将用于每个后续视图的前缀。当包含来自同一模块的多个视图时,这减少了重复,即:

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中不推荐使用字符串而不是视图函数,并且将在1.10中删除。

因为patterns()除了为基于字符串的视图导入添加前缀之外没有任何其他目的,所以这也已被弃用,并将在1.10中删除。

答案 1 :(得分:2)

请参阅1.8 release notes

  

patterns()用于很少的目的,在教授新内容时是一种负担   用户(回答新手的问题“为什么我需要这个空白   string作为patterns()的第一个参数?“)。出于这些原因,我们   正在弃用它。更新代码就像确保代码一样简单   urlpatterns是django.conf.urls.url()实例的列表