在Django的URLconf中使用命名组的方法


Posted in Python onJuly 18, 2015

在我们想要捕获的URL部分上加上小括号,Django 会将捕获的文本作为位置参数传递给视图函数。 在更高级的用法中,还可以使用 命名 正则表达式组来捕获URL,并且将其作为关键字参数传给视图。

一个 Python 函数可以使用关键字参数或位置参数来调用,在某些情况下,可以同时进行使用。 在关键字参数调用中,你要指定参数的名字和传入的值。 在位置参数调用中,你只需传入参数,不需要明确指明哪个参数与哪个值对应,它们的对应关系隐含在参数的顺序中。

例如,考虑这个简单的函数:

def sell(item, price, quantity):
  print "Selling %s unit(s) of %s at %s" % (quantity, item, price)

为了使用位置参数来调用它,你要按照在函数定义中的顺序来指定参数。

sell('Socks', '$2.50', 6)

为了使用关键字参数来调用它,你要指定参数名和值。 下面的语句是等价的:

sell(item='Socks', price='$2.50', quantity=6)
sell(item='Socks', quantity=6, price='$2.50')
sell(price='$2.50', item='Socks', quantity=6)
sell(price='$2.50', quantity=6, item='Socks')
sell(quantity=6, item='Socks', price='$2.50')
sell(quantity=6, price='$2.50', item='Socks')

最后,你可以混合关键字和位置参数,只要所有的位置参数列在关键字参数之前。 下面的语句与前面的例子是等价:

sell('Socks', '$2.50', quantity=6)
sell('Socks', price='$2.50', quantity=6)
sell('Socks', quantity=6, price='$2.50')

在 Python 正则表达式中,命名的正则表达式组的语法是 (?P<name>pattern) ,这里 name 是组的名字,而 pattern 是匹配的某个模式。

下面是一个使用无名组的 URLconf 的例子:

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
  (r'^articles/(\d{4})/$', views.year_archive),
  (r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
)

下面是相同的 URLconf,使用命名组进行了重写:

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
  (r'^articles/(?P<year>\d{4})/$', views.year_archive),
  (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive),
)

这段代码和前面的功能完全一样,只有一个细微的差别: 取的值是以关键字参数的方式而不是以位置参数的方式传递给视图函数的。

例如,如果不带命名组,请求 /articles/2006/03/ 将会等同于这样的函数调用:

month_archive(request, '2006', '03')

而带命名组,同样的请求就会变成这样的函数调用:

month_archive(request, year='2006', month='03')

使用命名组可以让你的URLconfs更加清晰,减少搞混参数次序的潜在BUG,还可以让你在函数定义中对参数重新排序。 接着上面这个例子,如果我们想修改URL把月份放到 年份的 前面 ,而不使用命名组的话,我们就不得不去修改视图 month_archive 的参数次序。 如果我们使用命名组的话,修改URL里提取参数的次序对视图没有影响。

当然,命名组的代价就是失去了简洁性: 一些开发者觉得命名组的语法丑陋和显得冗余。 命名组的另一个好处就是可读性强。

Python 相关文章推荐
python列表与元组详解实例
Nov 01 Python
urllib2自定义opener详解
Feb 07 Python
Python中一些自然语言工具的使用的入门教程
Apr 13 Python
python实现统计代码行数的方法
May 22 Python
Python文件及目录操作实例详解
Jun 04 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
django文档学习之applications使用详解
Jan 29 Python
对Pandas MultiIndex(多重索引)详解
Nov 16 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
使用python实现滑动验证码功能
Aug 05 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
python实现快递价格查询系统
Mar 03 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 #Python
在Django的URLconf中进行函数导入的方法
Jul 18 #Python
在Django的form中使用CSS进行设计的方法
Jul 18 #Python
在Django的视图中使用form对象的方法
Jul 18 #Python
详解Django中的form库的使用
Jul 18 #Python
在Django框架中编写Contact表单的教程
Jul 17 #Python
简单解析Django框架中的表单验证
Jul 17 #Python
You might like
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
PHP中的session安全吗?
2016/01/22 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
Python实现线程池代码分享
2015/06/21 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
详解python中的Turtle函数库
2018/11/19 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Python小白垃圾回收机制入门
2020/06/09 Python
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
商务英语应届生自我鉴定
2013/12/08 职场文书
《我的信念》教学反思
2014/02/15 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
销售内勤岗位职责
2015/02/10 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书