Skip to main content
 首页 » 编程设计

python之为什么 Django 1.8 和 1.7 中的 urls.py 不同

2025年05月04日29over140

在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 中删除。