URL 分配器(URL dispatcher)
一个干净、优雅的URL 方案是是设计高质量的Web应用程序中非常重要的一个细节,Django [‘dɡo](发音类似于’粘 狗’、 这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的,没有其他意思)让你用你想要的任何方式设计URL,并且没有框架结构限制。没有必要用.php或者.cgi,也一定没有(0,2097,1-1-1928,00)这种荒谬的东西。
请参考来自于www的创始人Tim Berners-Lee的一篇文章:Cool URIsdon’t change,在这篇文章里,关于为什么URLs应该是干净和可用的。他给出了一个卓越的理由。
概览
为了给一个应用设计URLs,你随便的创建了一个叫做URLconf的Python模块,也就是URL的配置,这个模块是用纯粹的Python代码写的,并且在URL模式(简单的正则表达式)和Python方法(你的views)之间做了一个简单的映射。
这个映射在需要的地方可长可短,它可以引用其他的映射,因为它是纯Python代码,它可以被动态构建。
Django提供了一种途按照活动的语言(此处还没搞懂,这个应该和python的国际化有关)翻译URLs的途径,详情请见:internationalizationdocumentation。
Django是如何处理一个请求的
当用户从你的Django网站请求一个页面的时候,
系统根据下面的运算规则去决定应该执行哪一段Python代码:
- Django判断根目录下的URLconf模块并使用,通常来说,设置ROOT_URLCONF的值,但是如果带有urlconf属性(由中间件设置)的HttpRequest的对象进来,那么它的值被替换成ROOT_URLCONF的设置。
- Django加载Python模块并查找urlpatterns变量。这应该是一个django.conf.urls.url()实例的Python列表。
- Django按顺序运行每个URL模式,并且当匹配到一个URL请求的时候就停止。
- 一旦正则表达式被匹配,Django导入并调用给定的view,这个view是一段简单的Python方法的代码,或者是一个基于类的view,这个view传递以下参数:
- l 一个HttpRequest实例
- l 如果匹配的正则表达式返回一个没有命名的组,那么来自正则表达式的这个匹配将被提供一个位置参数。
- l 参数的关键字又任何被正则表达式匹配的命名空间组成,通过重写被kwargs的可选参数指定的任何参数给django.conf.urls.url().传值。
- 如果没有正则表达式匹配,或者在任何程序处抛出了异常,Django回调一个合适的错误处理视图,详细请看下面的“异常处理”
举例
请看下面的URLconf样本
fromdjango.conf.urlsimport 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), ]
注意:
- 从URL中捕获值的时候,请用圆括号扩起来
- 这里没有必须要求添加一个前导斜线,因为每个URL都有,比如^articles不应该写成^/articles
- 这个在正则表达式字符串前面的’r’是可选的,但是建议使用上。它告诉Python这个字符串是原生的,在这个字符串中什么都不需要转义。详情请见Dive Into Python’s explanation.
时间: 2024-10-22 07:46:23