在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 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
python 文件操作删除某行的实例
Sep 04 Python
基于Python实现的ID3决策树功能示例
Jan 02 Python
python实现抖音视频批量下载
Jun 20 Python
pandas中apply和transform方法的性能比较及区别介绍
Oct 30 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
Django中的FBV和CBV用法详解
Sep 15 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
Jan 02 Python
Python虚拟环境venv用法详解
May 25 Python
Python import模块的缓存问题解决方案
Jun 02 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
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
使用JavaScript破解web
2018/09/28 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
python自动化测试实例解析
2014/09/28 Python
python实现多张图片拼接成大图
2019/01/15 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
python3 求约数的实例
2019/12/05 Python
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
全球工业:Global Industrial
2020/02/01 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
政风行风评议心得体会
2014/10/21 职场文书
银行自荐信范文
2015/03/25 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
导游词之包公祠
2019/11/25 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python