国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2019-11-25 17:47:41
字體:
來源:轉載
供稿:網友

之前對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版本。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石楼县| 广昌县| 乐平市| 会同县| 吉安县| 衡山县| 南木林县| 林周县| 德安县| 丘北县| 禄劝| 永春县| 铅山县| 沂源县| 郎溪县| 西乌珠穆沁旗| 三河市| 井陉县| 洱源县| 宜黄县| 阳朔县| 德庆县| 肥乡县| 兴文县| 大荔县| 静安区| 秭归县| 晋江市| 平乐县| 治县。| 曲阜市| 吴堡县| 雷州市| 湖北省| 武鸣县| 定陶县| 甘德县| 海阳市| 五华县| 固始县| 凭祥市|