在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中查看变量内存地址的方法
May 05 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
python遍历目录的方法小结
Apr 28 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
Python 共享变量加锁、释放详解
Aug 28 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
Python叠加矩形框图层2种方法及效果
Jun 18 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 Python
Spy++的使用方法及下载教程
Jan 29 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 file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python对列表排序的方法实例分析
2015/05/16 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
python使用Geany编辑器配置方法
2020/02/21 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
国际商务专业学生个人的自我评价
2013/09/28 职场文书
挂牌仪式主持词
2014/03/20 职场文书
高中学生期末评语
2014/04/25 职场文书
销售顾问工作计划书
2014/09/15 职场文书
人民调解协议书
2016/03/21 职场文书
TS 类型兼容教程示例详解
2022/09/23 Javascript