在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 相关文章推荐
分享15个最受欢迎的Python开源框架
Jul 13 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python_LDA实现方法详解
Oct 25 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
python 消除 futureWarning问题的解决
Dec 25 Python
python自动识别文本编码格式代码
Dec 26 Python
python如何调用php文件中的函数详解
Dec 29 Python
python爬取某网站原图作为壁纸
Jun 02 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 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访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
如何编写jquery插件
2017/03/29 jQuery
了解VUE的render函数的使用
2017/06/08 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
Python 字符串操作方法大全
2014/03/11 Python
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
python下10个简单实例代码
2017/11/15 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
eBay奥地利站:eBay.at
2019/07/24 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
运动会开幕式解说词
2014/02/05 职场文书
大学四年个人的自我评价
2014/02/26 职场文书
项目经理聘任书
2014/03/29 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
开学典礼演讲稿
2014/05/23 职场文书
节约用电标语
2014/06/17 职场文书
Python天气语音播报小助手
2021/09/25 Python