免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3771 | 回复: 0

[翻译]Elegant URL design--优雅的URL设计 [复制链接]

论坛徽章:
0
发表于 2009-11-20 20:21 |显示全部楼层

                                                                                                URL dispatcher一个干净的,优雅的URL机制(scheme)是高质量Web应用的一个重要的细节。Django让你随心所欲的设计URLs,没有框架的限制。There’s no .php or .cgi required, and certainly none of that 0,2097,1-1-1928,00 nonsense.
See
Cool URIs don’t change
, by World Wide Web creator Tim Berners-Lee, for excellent arguments on why URLs should be clean and usable.
Overview
给一个app创建URLs, 你需要创建一个叫URLconf(URL configuration)的模块(module)。这个模块是纯粹的Python代码,并且是URL patterns(简单的正则表达式)到python回调函数(callback functions)(你的视图views)的映射。这个映射的大小是任意的。它可以引用其他的映射。并且,因为它是纯粹的Python代码,可以任意的动态组合它。
How Django processes a request----Django如何处理一个请求
当一个用户页面请求,来自于你的Django架构的站点,以下是系统决定执行哪段代码时所需遵循的规律:a. Django决定了要使用的root URLconf module. 通常,这个值取自ROOT_URLCONF setting,但是如果收到的HttpRequest对象有一个属性叫做urlconf(由中间件request processing设定),这个值会取代ROOT_URLCONF.b. Django加载了这个Python模块, 找到变量urlpatterns. 它应该是一个Python list,格式与函数django.conf.urls.defaults.patterns()的返回值一致。c. Django依次遍历每个URL pattern, 在第一个与requested URL匹配的地方停下。d. 一旦有一个正则表达式匹配了,Django引入并调用相应的视图(view),一个简单的Python函数。视图被传的第1个参数是HttpRequest,正则表达式捕获的其他任意值作为另外的参数。Example
以下是一个URLconf的例子:
from django.conf.urls.defaults import *urlpatterns = patterns('',    (r'^articles/2003/$', 'news.views.special_case_2003'),    (r'^articles/(\d{4})/$', 'news.views.year_archive'),    (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),    (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),)
注:a. from django.conf.urls.defaults import *使得patterns()函数可用b. 要从URL中捕获一个值,将其括起来就行了c. 没有必要在前面加一个斜杠(slash),因为每个URL都有。例如,是 ^articles, not ^/articles.d. 每个正则表达式前的'r'是可选的,同时也是建议的。它告诉Python这个字符串是一个raw--即字符串中不含转义字符。见Dive into Python's explanation.requests例子:
a. 一个/articles/2005/03/请求匹配list中的第三项.Django会调用函数news.views.month_archive(request, '2005', '03').b. /articles/2005/3/不会匹配任何列表项, because the third entry in the list requires two digits for the month.c. /articles/2003/匹配第一项, not the second one, because the patterns are tested in order, and the first one is the first test to pass. Feel free to exploit the ordering to insert special cases like this./articles/2003 would not match any of these patterns, because each pattern requires that the URL end with a slash.d. /articles/2003/03/3/匹配最后一个。Django would call the function news.views.article_detail(request, '2003', '03', '3').Named groupsurlpatterns = patterns('',    (r'^articles/2003/$', 'news.views.special_case_2003'),    (r'^articles/(?P\d{4})/$', 'news.views.year_archive'),    (r'^articles/(?P\d{4})/(?P\d{2})/$','news.views.month_archive'),    (r'^articles/(?P\d{4})/(?P\d{2})/(?P\d+)/$','news.views.article_detail'),)
这个和前面那个例子效果相同,但有个细微的区别:捕获的值通过键值传参(keyword arguments)而不是位置传参(positional arguments)。For example:a. A request to /articles/2005/03/ would call the function news.views.month_archive(request, year='2005', month='03'), instead of news.views.month_archive(request, '2005', '03').b. A request to /articles/2003/03/3/ would call the function news.views.article_detail(request, year='2003', month='03', day='3').事实上,这意味着你的URLconfs更加简显,而不容易产生参数顺序方面的bug.--并且你可以更改你的view函数中参数的顺序。当然,这些优势来自简洁方面作出的牺牲;一些developers觉得named-group语法太难看,并且太冗长了(verbose)The matching/grouping algorithm
下面是URLconf解析器遵循的算法,分别针对named groups和non-named groups的正则表达式:如果含named arguments,它将会使用之,而忽略non-named arguments.反之,non-named参数会以位置传参的方式传递。在两种情况中,它都会以键值传参的方式传递其他的键值参数。What the URLconf searches againstURLconf搜索依据的是请求的URL,一个普通的Python string.并不包含GET或POST参数,或者域名。例如,请求
http://www.example.com/myapp/
,URLconf会查找myapp/.请求
http://www.example.com/myapp/?page=3
会查找myapp/.URLconf并不解析request method.换句话说--POST,GET,HEAD,etc--会路由到同样的函数,因为有同样的URLSyntax of the urlpatterns variable
urlpatterns应该是一个Python list,格式是函数django.conf.urls.defaults.patterns()的返回值。记得一定要用pattern()来创建urlpatterns变量。patternpatterns(prefix, pattern_description, ...)这个函数的参数,一个prefix,数目不确定的URL patterns,返回一个符合Django需求的URL patterns列表patterns()的第一个参数是字符串prefix.见下面的The view prefix.其他的参数应该是以下格式的元组(tuples):(正则表达式,Python回调函数[,可选的字典[,可选的名字]])(regular expression, Python callback function [, optional dictionary [,optional name]])
...where optional dictionary and optional name are optional. (See Passing extra options to view functions below.)urlurl(regex, view, kwargs=None, name=None, prefix='')你可以使用url()函数,而不是一个元组,来作为patterns()的一个参数。这个很便捷,如果你想指定一个name而又不用额外的参数字典。如:urlpatterns = patterns('',    url(r'^index/$', index_view, name="main-view"),    ...)
这个函数带有5个参数,其中大部分的都是可选的:url(regex, view, kwargs=None, name=None, prefix='')
至于name参数有什么用,见Naming URL pattern此处的prefix参数和patterns()的第一个参数是相同的意思,??handler404这是一个字符串,代表一个完整的Python import路径,这个路径指向一个view,这个view应该在没有URL patterns匹配时调用handler500这是一个字符串,代表一个完整的Python import路径,这个路径指向一个view,这个view应该在服务器错误时被调用。当在view的代码中有运行时错误时,会引发server error.(未完待续。。。)
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/72694/showart_2099667.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP