首页 > 编程 > Python > 正文

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

2020-02-23 00:37:36
字体:
来源:转载
供稿:网友

之前对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,所以拼装起来会乱掉,所以就不要尝试了。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表