django url 匹配 参数

作者: admin 分类: django 发布时间: 2013-08-14 18:34 ė 6 没有评论

 

一:URL是什么
URL是Uniform Resource Locator的简称,从名字上就看出有两个重点,第一它是唯一的;第二它能定位。一般性的URL由几个部分组成,举本博文的地址为例:http为超文本协议(HyperText Transfer Protocol)的缩写;www.ccpt.cc是域名,能定位到世界某一台特定的电脑主机;而django_url_dispatcher则在此计算机上定位到特定资源。在一般的网站框架下,域名之后都是资源文件的本机目录,而DJango不同,需要我们指定url和views的映射关系,和该页面在哪个目录下没有任何关系,因此显得比较复杂。当然这也是本篇存在的原因之一。

二:patterns()函数
还记得我们在mysite/ulrs.py里添加的代码是什么样子的么?容我赘述一次:

view plaincopy to clipboardprint?
  1. urlpatterns = patterns(“”,
  2.   url(r’^$’, ‘hello.views.home’),
  3. )

让我们看patterns函数的的原型:

  1. patterns(prefix, pattern_description, …)

其中prefix表示函数调用的前缀,而pattern_description则是一系列的元组。举例说明prefix的作用:

view plaincopy to clipboardprint?
  1. urlpatterns = patterns(“hello.views”,
  2.     url(r’^$’, ‘home’),
  3. )

上例和上上例的执行效果一样,都表明了hello app下的views文件里的home函数。注意:前缀末尾不必包含“.”;另外因为python函数规定参数不能多于255个,因此如果你的映射关系很多,可以利用诸如: urlpatterns += patterns(…)这种形式累加。

三:url()函数
当然我们可以在patterns里直接用元组的形式添加映射关系,但是还是推荐使用url函数(如我们使用的一样)。首先我们看url函数的原型:

view plaincopy to clipboardprint?
  1. url(regex, view, kwargs=None, name=None, prefix=”)

其中后三项是可选项,在我们的例子中:regex=”r’^$’”;view=”hello.views.home”;name项给该url命名,这在未来通过name反向确定url有很大的作用;kwargs则传递额外的参数;prefix和此前的prefix作用一致,不过只适用这一条url。

在下一篇介绍URL Reserve时再回头看name项的作用,下面先看DJango是如何传递url参数的,以及kwargs项的作用。

四:通过url传递信息
我们现在能做的只有一件事:通过正则匹配确定向客户展示哪些内容。但这是不够的。举个例子来说,一般的博客都喜欢以这样的url命名自己的博文:/year/month/day/xxx.html。如果我们按照我们前面所说的做,需要为每个日志设计url映射,这显然是不科学的,如果我们可以在确定展示什么内容之前确定用户请求里的year,month等信息的话,问题便迎刃而解了。

DJango在通过url传递参数时有两种方式,一种通过位置,一种通过关键词。我们先看第一种,改此前的映射关系如下:

view plaincopy to clipboardprint?
  1. url(r’^(d{4})/(d{2})$’, ‘hello.views.home’),

修改hello/views.py,增加两行代码如下:

view plaincopy to clipboardprint?
  1. def home(request, year=’0000′, month=’00’):
  2.     return HttpResponse(“Hello World “+year+” “+month)

这样当用户请求locahost:8000/2012/10时候,相当于在调用home(request, ’2012′, ’10′),注意此时year和month的相对关系,因为参数传递是基于位置信息的,第一个是4个数字是年,第二个2个数字是月,你可以自己测试一下。

下面是第二种,即关键词方式,我们修改两个文件如下:

view plaincopy to clipboardprint?
  1. #mysite/urls.py
  2. url(r’^(?P<year>d{4})/(?P<month>d{2})$’, ‘hello.views.home’),
  3. #hello/views.py
  4. #注意year和month的位置
  5. def home(request, month=’00’, year=’0000′):
  6.     return HttpResponse(“Hello World “+year+” “+month)
  7. </month></year>

OK,通过测试这两种方式,你应该能感受到这里面的差异了吧。当然还可以通过kwargs传递参数,修改mysite/urls.py:

view plaincopy to clipboardprint?
  1. url(r’^test$’, ‘hello.views.home’, {‘month’ : ’10’}),

当通过kwargs和url的keyword两种方式传递的参数名重复时,前者将会替代后者。

五:最后
这篇主要向大家讲解了在urls.py文件里如何映射url和对应的view,重点讲述了patterns()和url()两个函数的具体使用方法和注意事项。我们将要在下一篇对url的命名和reserve做更地深入学习了解。

本文出自 小Q,转载时请注明出处及相应链接。

本文永久链接: http://www.linuxqq.com/archives/1097.html

0
更多
Ɣ回顶部