在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编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
python画出三角形外接圆和内切圆的方法
Jan 25 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
利用Python如何批量更新服务器文件
Jul 29 Python
python os.path模块常用方法实例详解
Sep 16 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
Python调用飞书发送消息的示例
Nov 10 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 Python
python可视化大屏库big_screen示例详解
Nov 23 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
一个图形显示IP的PHP程序代码
2007/10/19 PHP
怎样去阅读一份php源代码
2009/08/21 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
php批量删除操作代码分享
2017/02/26 PHP
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python装饰器初探(推荐)
2016/07/21 Python
使用python实现链表操作
2018/01/26 Python
python实现k-means聚类算法
2018/02/23 Python
python绘制多个曲线的折线图
2020/03/23 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
全球立体声:World Wide Stereo
2018/09/29 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
Java基础知识面试要点
2016/07/29 面试题
投标邀请书范文
2014/01/31 职场文书
书法比赛获奖感言
2014/02/10 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
计算机系本科生求职信
2014/05/31 职场文书
禁烟标语大全
2014/06/11 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers