Python的Bottle框架的一些使用技巧介绍


Posted in Python onApril 08, 2015

之前对bottle做过不少的介绍,也写过一些文章来说明bottle的缺点,最近发现其实之前有些地方说的不太公平,所以趁此机会也来更正一下。

    bottle是支持类似flask url_for的语法的,具体使用方法在下文介绍
    bottle的request.query之类的参数默认是str类型,也是有原因的,比如我在给google做代理的时候,编码就不一定是utf8的,如果强制转化utf8就会报错
    之前的bug也得到了修正,比如mount(‘/x',app)之后,/x/和/x都可以访问到

OK,现在正式进入主题,我们来介绍一些bottle的一些高级使用

一. 智能创建url

这部分在bottle的文档上是没有介绍的(其实bottle明明实现了很多贴心的功能,不知道为啥都不写在文档上)。
在Bottle类里,有一个成员函数:

def get_url(self, routename, **kargs):
  """ Return a string that matches a named route """
  scriptname = request.environ.get('SCRIPT_NAME', '').strip('/') + '/'
  location = self.router.build(routename, **kargs).lstrip('/')
  return urljoin(urljoin('/', scriptname), location)
 
def get_url(self, routename, **kargs):
  """ Return a string that matches a named route """
  scriptname = request.environ.get('SCRIPT_NAME', '').strip('/') + '/'
  location = self.router.build(routename, **kargs).lstrip('/')
  return urljoin(urljoin('/', scriptname), location)

那么这个routename是哪里来的呢?看 route 装饰器的参数:

def route(self, path=None, method='GET', callback=None, name=None,
     apply=None, skip=None, **config):
 
def route(self, path=None, method='GET', callback=None, name=None,
     apply=None, skip=None, **config):

其中的name参数就是routename(这里不得不说一下,这种方式比flask要好些,要用才指定name,而不需要为了实现url_for,把整个框架都实现的很复杂)

所以看到这里大家也就明白了,bottle的url生成器是绑定在Bottle实例上的,所以跨实例访问默认是做不到的。
而可能由于bottle所推崇的micro化,所以其源码中特意对默认Bottle示例包装出了一个函数:

for name in '''route get post put delete error mount
        hook install uninstall'''.split():
  globals()[name] = make_default_app_wrapper(name)
url = make_default_app_wrapper('get_url')
del name
 
for name in '''route get post put delete error mount
        hook install uninstall'''.split():
  globals()[name] = make_default_app_wrapper(name)
url = make_default_app_wrapper('get_url')
del name

这样做的好处是,如果工程只用到默认的Bottle实例的话,在模板中就可以直接使用url,而不必再多传个Bottle实例进去。

更正一下,bottle的get_url是不能跨app调用的,比如被mount的app调用主app的get_url会错掉,因为此时的SCRIPT_NAME是当前页的path,所以拼装起来会乱掉,所以就不要尝试了。

但是怎么才能让模板能够访问到local变量呢?我们接下来介绍

二. 给模板指定默认的变量

因为笔者用的最多的是jinja2,所以模板相关的介绍都是以jinja2为例子.
由于bottle的很多实例都是使用的代理模式,如request,response,local,所以我们可以放心的将这些变量传入到模板默认变量里去。
代码也很简单:

from bottle import BaseTemplate

BaseTemplate.defaults.update(dict(
  request=request,
  local=local,
  )
)
 
from bottle import BaseTemplate
 
BaseTemplate.defaults.update(dict(
  request=request,
  local=local,
  )
)

有兴趣的话,大家也可以去直接看一下源码,很好懂

三. 给模板增加filters

还是以jinja2为例,直接给出代码如下:

from bottle import BaseTemplate

if 'filters' not in BaseTemplate.settings:
  BaseTemplate.settings['filters'] = {}

filters = BaseTemplate.settings['filters']

def urlencode_filter(params):
  '''
  urlencode
  '''
  from urllib import urlencode

  return urlencode(params)

filters.update(dict(
  urlencode=urlencode_filter,
  )
)
 
from bottle import BaseTemplate
 
if 'filters' not in BaseTemplate.settings:
  BaseTemplate.settings['filters'] = {}
 
filters = BaseTemplate.settings['filters']
 
def urlencode_filter(params):
  '''
  urlencode
  '''
  from urllib import urlencode
 
  return urlencode(params)
 
filters.update(dict(
  urlencode=urlencode_filter,
  )
)

OK,一共就是这些,这里基于的bottle版本是 0.10.9,如果有不相符的地方,请查看bottle版本。

Python 相关文章推荐
python list 合并连接字符串的方法
Mar 09 Python
Python中使用strip()方法删除字符串中空格的教程
May 20 Python
python实现文本文件合并
Dec 29 Python
python操作mysql代码总结
Jun 01 Python
selenium + python 获取table数据的示例讲解
Oct 13 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
python获取txt文件词向量过程详解
Jul 05 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
Aug 30 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
DRF框架API版本管理实现方法解析
Aug 21 Python
Python MNIST手写体识别详解与试练
Nov 07 Python
在Python的框架中为MySQL实现restful接口的教程
Apr 08 #Python
简单介绍Python的轻便web框架Bottle
Apr 08 #Python
常见的在Python中实现单例模式的三种方法
Apr 08 #Python
分析Python的Django框架的运行方式及处理流程
Apr 08 #Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 #Python
在Python中使用NLTK库实现对词干的提取的教程
Apr 08 #Python
使用Python操作Elasticsearch数据索引的教程
Apr 08 #Python
You might like
PHP中的类-什么叫类
2006/11/20 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
旅游管理实习自我鉴定
2013/09/29 职场文书
银行实习的自我鉴定
2013/12/10 职场文书
送货司机岗位职责
2013/12/11 职场文书
教师职称自我鉴定
2014/02/12 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
护士自荐信怎么写
2015/03/06 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
导游词之天津盘山
2019/11/01 职场文书