在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 EOL while scanning string literal问题解决方法
Sep 18 Python
python如何获取服务器硬件信息
May 11 Python
python 换位密码算法的实例详解
Jul 19 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
python 每天如何定时启动爬虫任务(实现方法分享)
May 21 Python
对python Tkinter Text的用法详解
Oct 11 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
Python 使用list和tuple+条件判断详解
Jul 30 Python
Django继承自带user表并重写的例子
Nov 18 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 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/15 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
2019/08/20 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
在Python中操作文件之read()方法的使用教程
2015/05/24 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
python 进程的几种创建方式详解
2019/08/29 Python
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
EJB的激活机制
2013/10/25 面试题
煤矿班组长岗位职责
2013/12/29 职场文书
试用期转正鉴定评语
2014/01/27 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
python实现简单的井字棋
2021/05/26 Python