在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中实现三目运算的方法
Jun 21 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
Django 视图层(view)的使用
Nov 09 Python
python pytest进阶之fixture详解
Jun 27 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
Python如何实现的二分查找算法
May 27 Python
python中round函数如何使用
Jun 19 Python
Python 绘制可视化折线图
Jul 22 Python
python中os.remove()用法及注意事项
Jan 31 Python
python必学知识之文件操作(建议收藏)
May 30 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 文件缓存函数
2011/10/08 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
Python简单实现enum功能的方法
2016/04/25 Python
Python中的descriptor描述器简明使用指南
2016/06/02 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
Django中的ajax请求
2018/10/19 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
通过cmd进入python的实例操作
2019/06/26 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
python基于opencv实现人脸识别
2021/01/04 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
《小小竹排画中游》教学反思
2014/02/26 职场文书
财务部总监岗位职责
2014/03/12 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery