在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 13 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
Python实现自动登录百度空间的方法
Jun 10 Python
python使用SMTP发送qq或sina邮件
Oct 21 Python
python矩阵转换为一维数组的实例
Jun 05 Python
Python-ElasticSearch搜索查询的讲解
Feb 25 Python
详解小白之KMP算法及python实现
Apr 04 Python
python之信息加密题目详解
Jun 26 Python
anaconda如何查看并管理python环境
Jul 05 Python
详解python statistics模块及函数用法
Oct 27 Python
Django-migrate报错问题解决方案
Apr 21 Python
python代码中怎么换行
Jun 17 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/08/03 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
零基础php编程好学吗
2019/10/11 PHP
用javascript实现画板的代码
2007/09/05 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
Node.js 的模块知识汇总
2017/08/16 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
python中split方法用法分析
2015/04/17 Python
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
linux面试题参考答案(7)
2012/10/29 面试题
竞聘自述材料
2014/08/25 职场文书
股权转让协议范本
2014/12/07 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL