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实现子类调用父类的方法
Nov 10 Python
Python的字典和列表的使用中一些需要注意的地方
Apr 24 Python
python基于phantomjs实现导入图片
May 13 Python
Python实现KNN邻近算法
Jan 28 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
Python Pandas数据中对时间的操作
Jul 30 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
Python使用xpath实现图片爬取
Sep 16 Python
python实现视频压缩功能
Dec 18 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
学习php笔记 字符串处理
2010/10/19 PHP
php检测useragent版本示例
2014/03/24 PHP
php 猴子摘桃的算法
2017/06/20 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
基于Jquery的温度计动画效果
2010/06/18 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
详解微信小程序 页面跳转 传递参数
2016/12/08 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
Python实现针对中文排序的方法
2017/05/09 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
详解python pandas 分组统计的方法
2019/07/30 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
领导班子对照检查材料
2014/09/22 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL