Django 路由 —— Djangon如何处理一个请求

 

Django URL路由概述正则表达式

一个干净优雅的URL方案是高质量Web应用程序中的一个重要细则
Django能够让你设计URL,不管你想要什么,没有框剪限制
要为应用程序设计URL,您能够非正式地建立一个名为URLconf(URL configura URL配置)的Python模块。
这个模块是纯Python代码,是一个简单的Python模式(简单的正则表达式)到Python函数(您的视图)之间的映射算法

 

Djangon如何处理一个请求django

当用户从Django服务器站点请求页面时,系统遵循如下算法来肯定要执行的Python代码:服务器


1.  首先Django肯定要使用的根URLconf模块。经过 ROOT_URLCONF 来设置,具体在 settings.py 配置文件中。函数

      可是若是传入HttpRequest对象具备urlconf属性(由中间件设置),则其值将替换ROOT_URLCONF设置。测试

2. Django加载该Python模块并查找该变量urlpatterns。这应该是一个Python的django.conf.urls.url()实例列表。url


3. Django按顺序运行每一个URL模式,并在匹配所请求的URL的第一个URL中中止。spa


4. 一旦正则表达式匹配,Django将导入并调用给定的视图,这是一个简单的PYthon函数(或基于类的视图)。该视图经过如下参数传递:设计

  • 4.1 一个实例 HttpRequest。
  • 4.2 若是匹配的正则表达式没有返回任何命名组,那么来自正则表达式的匹配将做为位置参数提供。
  • 4.3 关键字参数由正则表达式匹配的任何命名组组成,由可选kwargs参数中指定的任何参数覆盖django.conf.urls.url()

5. 若是没有正则表达式匹配,或在此过程当中的任何一点出现异常,Django将调用适当的错误处理视图。code

 

示例
如下是一个URLconf示例:

 1 from django.conf.urls import url  2  3 from . import views  4  5 urlpatterns = [  6 url(r'^articles/2003/$', views.special_case_2003),  7 url(r'^articles/([0-9]{4})/$', views.year_archive),  8 url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),  9 url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), 10 ]

说明:
1. 要从URL捕获一个值,只须要将其括起来
2.没有必要添加一个主要的斜杠,由于每一个URL都含有。例如^articles , 不是 ^/articles。
3.正则表达式前面的 'r' 是可选的,可是推荐使用。它告诉Python 这个字符串是一个'raw'(元字符串,字符串中没有任何内容被转义)

请求示例:
/articles/2005/03/    将匹配列表中的第三个条目。Django会调用views.month_archive(request, '2005', '03')函数

/articles/2005/3/      不会匹配其中的任何 URL模式 。由于第三个条目中 views.month_archive 月份须要两位数字。

/articles/2003/         将匹配列表中的第一个个模式,而不是第二个。由于模式是按顺序测试的,第一个模式是 第一个经过测试 的 。像这样能够很随意地插入一些特殊的模式。在这里,Django会调用 views.special_case_2003(request)

/articles/2003           将不匹配这些模式中的任何一个,由于每一个模式都要求URL以斜杠结尾。

/articles/2003/03/03/  将会匹配最后一个模式,Django会调用 views.article_detail(request, '2003', '03', '03') 函数


注意:每一个捕获的参数都做为纯Python字符串发送到视图,不管正则表达式匹配的是什么,即便[0-9]{4} 只会匹配整数字符串。

相关文章
相关标签/搜索