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实现在线程里运行scrapy的方法
Apr 07 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
Feb 21 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
使用python 写一个静态服务(实战)
Jun 28 Python
python框架flask表单实现详解
Nov 04 Python
python3 字符串知识点学习笔记
Feb 08 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
Python 使用dict实现switch的操作
Apr 07 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 Python
python语言中pandas字符串分割str.split()函数
Aug 05 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
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
各种常用浏览器getBoundingClientRect的解析
2009/05/21 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
python字符串替换的2种方法
2014/11/30 Python
Python运用于数据分析的简单教程
2015/03/27 Python
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
建筑实习自我鉴定
2013/10/18 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
秋季校运动会广播稿
2014/02/23 职场文书
2014学年自我鉴定
2014/02/23 职场文书
教研活动总结
2014/04/28 职场文书
违反交通法规检讨书
2014/09/10 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
给老师的感谢信
2015/01/20 职场文书
撤诉状格式范本
2015/05/19 职场文书
MySQL数据库完全卸载的方法
2022/03/03 MySQL