Python的Bottle框架的一些使用技巧介绍
之前对bottle做过不少的介绍,也写过一些文章来说明bottle的缺点,最近发现其实之前有些地方说的不太公平,所以趁此机会也来更正一下。 bottle是支持类似flask url_for的语法的,具体使用方法在下文介绍 OK,现在正式进入主题,我们来介绍一些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,location) 那么这个routename是哪里来的呢?看 route 装饰器的参数: def route(self,path=None,method='GET',callback=None,name=None,apply=None,skip=None,**config): def route(self,**config): 其中的name参数就是routename(这里不得不说一下,这种方式比flask要好些,要用才指定name,而不需要为了实现url_for,把整个框架都实现的很复杂) 所以看到这里大家也就明白了,bottle的url生成器是绑定在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为例子. from bottle import BaseTemplate BaseTemplate.defaults.update(dict( request=request,local=local,) ) from bottle import BaseTemplate BaseTemplate.defaults.update(dict( request=request,) ) 有兴趣的话,大家也可以去直接看一下源码,很好懂
还是以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版本。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |