在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编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
python版本的读写锁操作方法
Apr 25 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
利用Python中unittest实现简单的单元测试实例详解
Jan 09 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
python实现网页自动签到功能
Jan 21 Python
Django 表单模型选择框如何使用分组
May 16 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
Jupyter Notebook输出矢量图实例
Apr 14 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 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
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
PHP多线程类及用法实例
2014/12/03 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
php技巧小结【推荐】
2017/01/19 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
基于jQuery的history历史记录插件
2010/12/11 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
详解JavaScript树结构
2017/01/09 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
python简单实现计算过期时间的方法
2015/06/09 Python
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
tornado 多进程模式解析
2018/01/15 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
日化店促销方案
2014/03/26 职场文书
护理目标管理责任书
2014/07/25 职场文书
水电维修专业推荐信
2014/09/06 职场文书
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers
MySQL查询日期时间
2022/05/15 MySQL
python区块链持久化和命令行接口实现简版
2022/05/25 Python