在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中函数的调用与定义
Mar 14 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
Mar 01 Python
Python Pandas分组聚合的实现方法
Jul 02 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
python3读取autocad图形文件.py实例
Jun 05 Python
python实现excel公式格式化的示例代码
Dec 23 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 Python
python flask开发的简单基金查询工具
Jun 02 Python
Python预测分词的实现
Jun 18 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
超级给力的JavaScript的React框架入门教程
2015/07/02 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
vue实现分页组件
2020/06/16 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Unicode和Python的中文处理
2017/03/19 Python
Python面向对象程序设计示例小结
2019/01/30 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
浅谈Python type的使用
2019/11/19 Python
python基于opencv检测程序运行效率
2019/12/28 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
中国最大的名表商城:万表网
2016/08/29 全球购物
文史专业毕业生自荐信
2013/11/17 职场文书
区域总监的岗位职责
2013/11/21 职场文书
小区门卫管理制度
2014/01/29 职场文书
工作散漫检讨书
2014/09/16 职场文书
公司员工安全协议书
2014/11/21 职场文书
2015年人事科工作总结
2015/04/28 职场文书
煤矿安全生产管理协议书
2016/03/22 职场文书