Python的Bottle架構的一些提示介紹

來源:互聯網
上載者:User
之前對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 BaseTemplateBaseTemplate.defaults.update(dict(  request=request,  local=local,  )) from bottle import BaseTemplate BaseTemplate.defaults.update(dict(  request=request,  local=local,  ))

有興趣的話,大家也可以去直接看一下源碼,很好懂


三. 給模板增加filters

還是以jinja2為例,直接給出代碼如下:

from bottle import BaseTemplateif '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版本。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.