Django URL调度

来源:互联网 发布:mac chmod 777 编辑:程序博客网 时间:2024/05/22 14:27

当用户请求一个页面时,通过以下运算法则决定执行哪一段 Python代码:
Django首先检查 settings file 中的 ROOT_URLCONF 设置. 这是一个表示 Python 导入 URLconf 需要的绝对路径字符串. 例如: “mydjangoapps.urls”.
Django 载入这个 Python 模块并寻找变量 urlpatterns. 该变量是一个 django.conf.urls.defaults.patterns() 函数返回值格式的元素组成的列表.
Django 顺序处理每个 URL 模式, 直到找到一个与请求URL的相匹配的模式为止.
一旦匹配成功, Django 导入并调用对应的 view, 也就是相应的 Python 函数. 这个 view 函数会得到一个 request object 作为它的第一个参数, 在正则表达式匹配中得到的其它值也传递给 view 作为其它的参数.

1.命名分组

在 Python 正则表达式里, 命名分组的语法是 (?Ppattern), 这里 name 是分组的名字而 pattern 是要匹配的模式.
下面用命名分组重写上面的例子:

urlpatterns = patterns('',(r'^articles/2003/$','news.views.special_case_2003'), (r'^articles/(?P<year>d{4})/$', 'news.views.year_archive'), (r'^articles/(?P<year>d{4})/(?P<month>d{2})/$', 'news.views.month_archive'), (r'^articles/(?P<year>d{4})/(?P<month>d{2})/(?P<day>d+)/$', 'news.views.article_detail'), )

上面的代码与前面的代码功能完全相同, 不过传递给 view 函数的不再是位置相关参数,而变成了关键字参数.比如:
页面请求 /articles/2005/03/ 会自动调用函数 news.views.month_archive(request, year='2005', month='03'), 而不是 news.views.month_archive(request, '2005', '03').
页面请求 /articles/2003/03/3/ 会自动调用函数 news.views.article_detail(request, year='2003', month='03', day='3').
实际上, 这意味着 URLconfs 更清晰,而且避免了参数顺序错误引发的 bug – 定义 view 函数时不必特别在意参数的顺序.

2.URLconf 搜索依据

URLconf 根据请求 URL (作为标准 Python 字符串处理) 进行搜索. 不包括任何 GET 或 POST 参数,也不包括域名.
比如,页面请求 http://www.example.com/myapp/, URLconf 将查找 /myapp/.
对页面请求 http://www.example.com/myapp/?page=3, URLconf 将查找 /myapp/.
URLconf 不考虑请求的方法. 也就是说,同一 URL 不论使用何种请求方法 – POST, GET, HEAD, 等等. – 都会导向同一个 view 函数.

3.view 前缀

你可在 patterns() 调用时指定一个通用的 view 前缀, 以减少代码重复.
下面是来自 Django overview 的一个 URLconf 示例:

from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^articles/(d{4})/$', 'myproject.news.views.year_archive'), (r'^articles/(d{4})/(d{2})/$', 'myproject.news.views.month_archive'),(r'^articles/(d{4})/(d{2})/(d+)/$', 'myproject.news.views.article_detail'), )

在这个例子里,每个 view 都有同样的前缀 – ‘myproject.news.views’.你可以利用 patterns() 函数的第一个参数来指定一个 view 前缀, 该前缀将应用在每一个 view 函数上.
下面重写上面的例子,两者对比一下,后者简明的多:

from django.conf.urls.defaults import * urlpatterns = patterns('myproject.news.views',(r'^articles/(d{4})/$', 'year_archive'),(r'^articles/(d{4})/(d{2})/$', 'month_archive'),(r'^articles/(d{4})/(d{2})/(d+)/$', 'article_detail'), )

4.包括其它的 URLconfs

在任意位置, urlpatterns 可以 “include” 其它的 URLconf 模块. This essentially “roots” a set of URLs below other ones.
举例来说, 下面是 Django website 的 URLconf. 它包括了一系列其它 URLconfs:

from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^weblog/', include('django_website.apps.blog.urls.blog')), (r'^documentation/', include('django_website.apps.docs.urls.docs')), (r'^comments/', include('django.contrib.comments.urls.comments')), )

注意上例中的正则表达式以一个反斜线而不是 $ 字符(表示字符串结束)结尾.只要 Django 遇到 include(), 它就在该点砍掉任何匹配的 URL 部分,并将剩余的部分发送到 URLconf 以进行下一步处理。

5.传递额外参数给 view 函数

URLconfs 允许以 Python 字典的形式传递额外的参数给 view 函数.
任何 URLconf tuple 都可以有可选的第三个元素, 一个传递给 view 函数的额外的字典参数.
示例:

urlpatterns = patterns('blog.views', (r'^/blog/(?P<year>d{4})/$', 'year_archive', {'foo': 'bar'}), )

在这个例子里, 页面请求 /blog/2005/, Django 会自动调用 blog.views.year_archive() 函数, 并传递给它以下关键字参数:

year='2005', foo='bar'
0 0
原创粉丝点击