在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线程的两种编程方式
Apr 14 Python
Python 中 list 的各项操作技巧
Apr 13 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
Oct 14 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
keras实现多种分类网络的方式
Jun 11 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 Python
Python列表的索引与切片
Apr 07 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入门教程 精简版
2009/12/13 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
php常用正则函数实例小结
2016/12/29 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
JavaScript基础之this详解
2017/06/04 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
python实现telnet客户端的方法
2015/04/15 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
体育之星事迹材料
2014/05/11 职场文书
公关活动策划方案
2014/05/25 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL