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

作者:vimer 时间:2022-11-10 08:05:35 

之前对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,Bottle
0
投稿

猜你喜欢

  • Python基于DFA算法实现内容敏感词过滤

    2023-07-25 20:14:11
  • python将人民币转换大写的脚本代码

    2021-03-05 17:36:23
  • oracle 在一个存储过程中调用另一个返回游标的存储过程

    2009-09-26 18:54:00
  • Kettle下载安装pdi-ce-7.1.0.0-12教程

    2023-11-27 05:38:36
  • CentOS7离线安装MySQL的教程详解

    2024-01-20 13:07:33
  • 支付宝小程序向用户发红包的实现方法

    2022-12-19 22:58:58
  • 动态给表添加删除字段并同时修改它的插入更新存储过程

    2024-01-17 22:12:56
  • 利用Java正则表达式校验邮箱与手机号

    2023-07-03 15:14:54
  • MySQL Explain命令用于查看执行效果

    2009-02-27 15:30:00
  • jszip插件实现图片打包下载的方法分析 <font color=red>原创</font>

    2024-05-09 10:34:34
  • python numpy 中linspace函数示例详解

    2021-12-12 01:47:59
  • MySQL数据库必备之条件查询语句

    2024-01-25 18:41:41
  • 修改 Navicat 默认备份路径

    2009-08-23 21:10:00
  • 虚拟环境下搭建一个Django项目

    2023-06-15 12:30:39
  • 关于vue中的时间格式转化问题

    2024-05-13 09:44:07
  • 利用python实现冒泡排序算法实例代码

    2021-06-29 17:00:14
  • 带你了解MySQL中的事件调度器EVENT

    2024-01-18 05:55:16
  • Win10下Python3.7.3安装教程图解

    2023-09-02 18:16:54
  • 详解Go程序添加远程调用tcpdump功能

    2024-05-21 10:18:45
  • 微信小程序前端如何调用python后端的模型详解

    2023-03-12 06:29:13
  • asp之家 网络编程 m.aspxhome.com