在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实现的Kmeans++算法实例
Apr 26 Python
在Python中使用Neo4j数据库的教程
Apr 16 Python
python 显示数组全部元素的方法
Apr 19 Python
django解决跨域请求的问题
Nov 11 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
python安装pil库方法及代码
Jun 25 Python
python处理大日志文件
Jul 23 Python
python DataFrame转dict字典过程详解
Dec 26 Python
Python基础之函数原理与应用实例详解
Jan 03 Python
使用python客户端访问impala的操作方式
Mar 28 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
生成缩略图
2006/10/09 PHP
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
checkbox在vue中的用法小结
2018/11/13 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
python复制与引用用法分析
2015/04/08 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
python opencv实现证件照换底功能
2019/08/19 Python
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
水果连锁超市创业计划书
2014/01/24 职场文书
企业申诉管理制度
2014/01/30 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
单位租车协议书
2015/01/29 职场文书
北京颐和园导游词
2015/01/30 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python