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处理cookie详解
Feb 07 Python
python使用循环实现批量创建文件夹示例
Mar 25 Python
浅析Python中的多重继承
Apr 28 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
django启动uwsgi报错的解决方法
Apr 08 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
python如何保存文本文件
Jun 07 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 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数组操作――获取数组最后一个值的方法
2015/04/14 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
电气专业推荐信范文
2013/11/18 职场文书
主持人演讲稿范文
2013/12/28 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
精神病医院见习报告
2014/11/03 职场文书
《鲸》教学反思
2016/02/23 职场文书