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 相关文章推荐
初步剖析C语言编程中的结构体
Jan 16 Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 Python
深入浅析python 中的匿名函数
May 21 Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
简单了解python中的与或非运算
Sep 18 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
Django中template for如何使用方法
Jan 31 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
vue2里面ref的具体使用方法
2017/10/27 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
Python中subprocess的简单使用示例
2015/07/28 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python读取ini配置文件过程示范
2019/12/23 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
机械工程师的岗位职责
2013/11/17 职场文书
幼儿园教师奖惩制度
2014/02/01 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
保安岗位职责
2014/02/21 职场文书
会计的岗位职责
2014/03/15 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
教师节倡议书2015
2015/04/27 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android