最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Python中使用Mako模版庫的簡單教程

 更新時間:2015年04月08日 11:34:21   作者:Corner-xm  
這篇文章主要介紹了在Python中使用Mako模版庫的簡單教程,包括在Django或者Tornado框架中集成Mako的方法,需要的朋友可以參考下

Mako是一個高性能的Python模板庫,它的語法和API借鑒了很多其他的模板庫,如Django、Jinja2等等。
基本用法

創(chuàng)建模板并渲染它的最基本的方法是使用 Template 類:
 

from mako.template import Template
t = Template('hello world!')
print t.render()

傳給 Template 的文本參數(shù)被編譯為一個Python模塊。模塊包含一個 render_body() 函數(shù),它產(chǎn)生模板的輸出。調(diào)用 render() 方法時,Mako建立了一個模板的運行環(huán)境,并調(diào)用 render_body() 函數(shù),把輸出保存到緩沖,返回它的字符串內(nèi)容。
render_body() 函數(shù)中可以訪問一個變量集??梢韵?render() 方法發(fā)送額外的關(guān)鍵詞參數(shù)來指定這些變量:
 

from mako.template import Template
t = Template('hello, ${name}!')
print t.render(name='yeolar')

render() 方法使Mako創(chuàng)建一個 Context 對象,它存儲模板可以訪問的所有變量和一個用來保存輸出的緩沖。也可以自己創(chuàng)建 Context ,用 render_context() 方法使模板用它來渲染:
 

from mako.template import Template
from mako.runtime import Context
from StringIO import StringIO
t = Template('hello, ${name}!')
buf = StringIO()
c = Context(buf, name='yeolar')
t.render_context(c)
print buf.getValue()

使用文件模板

Template 也可以從文件加載模板,使用 filename 參數(shù):
 

from mako.template import Template
t = Template(filename='/docs/tpl.txt')
print t.render()

為了提高性能,從文件加載的 Template 還可以在文件系統(tǒng)中將生成的模塊緩存為一般的Python模塊文件(.py文件),這通過添加 module_directory 參數(shù)實現(xiàn):

from mako.template import Template
t = Template(filename='/docs/tpl.txt', module_directory='/tmp/mako_modules')
print t.render()

上面的代碼渲染后,會創(chuàng)建一個/tmp/mako_modules/docs/tpl.txt.py文件,其中包含模塊的源代碼。下次同樣參數(shù)的 Template 創(chuàng)建時,自動重用這個模塊文件。
使用TemplateLookup

到現(xiàn)在的例子都是有關(guān)單個 Template 對象的用法。如果模板中的代碼要定位其他模板資源,需要某種使用URI來找到它們的方法。這種需求是由 TemplateLookup 類來達到的。這個類通過傳入一個模板查找目錄的列表來構(gòu)造,然后作為關(guān)鍵詞參數(shù)傳給 Template 對象:
 

from mako.template import Template
from mako.lookup import TemplateLookup
lookup = TemplateLookup(directories=['/docs'])
t = Template('<%include file="header.txt" /> hello word!', lookup=lookup)

上面創(chuàng)建的模板中包含文件header.txt。為了查找header.txt,傳了一個 TemplateLookup 對象給它。
通常,應(yīng)用會以文本文件形式在文件系統(tǒng)上存儲大部分或全部的模板。一個真正的應(yīng)用會直接從 TemplateLookup 取得它的模板,使用 get_template() 方法,它接受需要的模板的URI作為參數(shù):
 

from mako.template import Template
from mako.lookup import TemplateLookup
lookup = TemplateLookup(directories=['/docs'], module_directory='/tmp/mako_modules')
def serve_template(t_name, **kwargs):
  t = lookup.get_template(t_name)
  print t.render(**kwargs)

上面的例子中我們創(chuàng)建了一個 TemplateLookup ,它從/docs目錄中查找模板,并把所有的模塊文件存儲到/tmp/mako_modules目錄中。通過將傳入的URI附加到每個查找目錄來定位模板,如傳遞/etc/beans/info.txt,將查找文件/docs/etc/beans/info.txt,如果沒找到將拋出 TopLevelNotFound 異常。
當(dāng)定位到模板的時候,傳給 get_template() 調(diào)用的URI也會作為 Template 的 uri 屬性。 Template 使用這個URI來得到模塊文件的名字,因此上面的例子中對/etc/beans/info.txt會創(chuàng)建模塊文件/tmp/mako_modules/etc/beans/info.txt.py。
設(shè)置收集的大小

TemplateLookup 還滿足將內(nèi)存中緩存的模板總數(shù)設(shè)為一個固定的值。默認(rèn)情況 TemplateLookup 大小是不限的??梢杂?collection_size 參數(shù)指定一個固定值:
 

lookup = TemplateLookup(directories=['/docs'], module_directory='/tmp/mako_modules', collection_size=500)

上面的 lookup 將模板加載到內(nèi)存中的上限是500個。之后,它將使用LRU策略來清理替換模板。
設(shè)置文件系統(tǒng)檢查

TemplateLookup 的另一個重要標(biāo)志是 filesystem_checks 。默認(rèn)為 True ,每次 get_template() 方法返回一個模板,會比較原始模板文件的修改時間和模板的最近加載時間,如果文件更新,就重新加載和編譯模板。在生產(chǎn)系統(tǒng)中,將 filesystem_checks 設(shè)為 False 能獲得一些性能的提升。
使用Unicode和編碼

Template 和 TemplateLookup 可以設(shè)置 output_encoding 和 encoding_errors 參數(shù)來將輸出編碼為Python支持的編碼格式:
 

from mako.template import Template
from mako.lookup import TemplateLookup
lookup = TemplateLookup(directories=['/docs'], output_encoding='utf-8', encoding_errors='replace')
t = lookup.get_template('foo.txt')
print t.render()

使用Python 3時,如果設(shè)置了 output_encoding , render() 方法將返回一個 bytes 對象,否則返回 string 。
render_unicode() 方法返回模板輸出為Python unicode 對象,Python 3為 string :
 

print t.render_unicode()

上面的方法沒有輸出編碼的參數(shù),可以自行編碼:
 

print t.render_unicode().encode('utf-8', 'replace')

注意Mako中模板的底層輸出流是Python Unicode對象。
處理異常

模板異??赡馨l(fā)生在兩個地方。一個是當(dāng)你查找、解析和編譯模板的時候,一個是運行模板的時候。模板運行中發(fā)生的異常會正常在產(chǎn)生問題的Python代碼處拋出。Mako有自己的一組異常類,它們主要用于模板構(gòu)造的查找和編譯階段。Mako提供了一些庫例程用來對異常棧提供Mako的信息,并將異常輸出為文本或HTML格式。Python文件名、行號和代碼片段會被轉(zhuǎn)換為Mako模板文件名、行號和代碼片段。Mako模板模塊的行會被轉(zhuǎn)換為原始的模板文件對應(yīng)行。

text_error_template() 和 html_error_template() 函數(shù)用于格式化異常跟蹤。它們使用 sys.exc_info() 來得到最近拋出的異常。這些處理器的用法像下面這樣:
 

from mako import exceptions
try:
  t = lookup.get_template(uri)
  print t.render()
except:
  print exceptions.text_error_template().render()
或者渲染為HTML:
from mako import exceptions
try:
  t = lookup.get_template(uri)
  print t.render()
except:
  print exceptions.html_error_template().render()

html_error_template() 模板接受兩個選項:指定 full=False 只渲染HTML的一節(jié),指定 css=False 關(guān)閉默認(rèn)的樣式表。如:
 

print exceptions.html_error_template().render(full=False)

HTML渲染函數(shù)也可以用 format_exceptions 標(biāo)志加到 Template 中。這種情況下,模板在渲染階段的任何異常在輸出中的結(jié)果都會替換為 html_error_template() 的輸出:
 

t = Template(filename='/foo/bar', format_exceptions=True)
print t.render()

注意上面模板的編譯階段發(fā)生在構(gòu)造 Template 時,沒有定義輸出流。因此查找、解析、編譯階段發(fā)生的異常正常情況下不會被處理,而是傳播下去。渲染前的追溯不包括Mako形式的行,這意味著渲染前和渲染中發(fā)生的異常會用不同的方式處理,因此 try/except 可能更常用。

錯誤模板函數(shù)使用的底層對象是 RichTraceback 對象。這個對象也可以直接用來提供自定義的錯誤視圖。下面是一個用法的樣例:
 

from mako.exceptions import RichTraceback
try:
  t = lookup.get_template(uri)
  print t.render()
except:
  traceback = RichTraceback()
  for (filename, lineno, function, line) in traceback.traceback:
    print 'File %s, line %s, in %s' % (filename, lineno, function)
    print line, '\n'
  print '%s: %s' % (str(traceback.error.__class__.__name__), traceback.error)

集成Mako
在Django中集成Mako

通過Django的中間件可以集成Mako。首先需要安裝django-mako模塊。
在Django項目的settings.py文件中,修改 MIDDLEWARE_CLASSES ,添加 djangomako.middleware.MakoMiddleware 。使用 render_to_response() 函數(shù)即可使用:
 

from djangomako.shortcuts import render_to_response
def hello_view(request):
  return render_to_response('hello.txt', {'name': 'yeolar'})

在Tornado中集成Mako

在Tornado中可以直接使用Mako,下面是一個使用示例:

import tornado.web
import mako.lookup
import mako.template
LOOK_UP = mako.lookup.TemplateLookup(
    directories=[TEMPLATE_PATH], module_directory='/tmp/mako',
    output_encoding='utf-8', encoding_errors='replace')
class BaseHandler(tornado.web.RequestHandler):
  def initialize(self, lookup=LOOK_UP):
    '''Set template lookup object, Defalut is LOOK_UP'''
    self._lookup = lookup
  def render_string(self, filename, **kwargs):
    '''Override render_string to use mako template.
    Like tornado render_string method, this method
    also pass request handler environment to template engine.
    '''
    try:
      template = self._lookup.get_template(filename)
      env_kwargs = dict(
        handler = self,
        request = self.request,
        current_user = self.current_user,
        locale = self.locale,
        _ = self.locale.translate,
        static_url = self.static_url,
        xsrf_form_html = self.xsrf_form_html,
        reverse_url = self.application.reverse_url,
        )
      env_kwargs.update(kwargs)
      return template.render(**env_kwargs)
    except:
      # exception handler
      pass
  def render(self, filename, **kwargs):
    self.finish(self.render_string(filename, **kwargs))

您可能感興趣的文章:

相關(guān)文章

  • pycharm2023.1配置python解釋器時找不到conda環(huán)境解決辦法

    pycharm2023.1配置python解釋器時找不到conda環(huán)境解決辦法

    如果你已經(jīng)安裝了Anaconda或Miniconda,但是在PyCharm中找不到conda解釋器,可以試試本文介紹的方法,這篇文章主要給大家介紹了關(guān)于pycharm2023.1配置python解釋器時找不到conda環(huán)境的解決辦法,需要的朋友可以參考下
    2023-12-12
  • Python Socket庫基礎(chǔ)方法與應(yīng)用詳解

    Python Socket庫基礎(chǔ)方法與應(yīng)用詳解

    這篇文章主要介紹了關(guān)于Python socket庫的詳細(xì)技術(shù)解析,包含基礎(chǔ)方法說明、工作原理剖析,以及多個應(yīng)用領(lǐng)域的完整實現(xiàn)代碼,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2025-04-04
  • Django 框架模型操作入門教程

    Django 框架模型操作入門教程

    這篇文章主要介紹了Django 框架模型操作,結(jié)合實例形式分析了Django框架相關(guān)的數(shù)據(jù)庫配置、數(shù)據(jù)增刪改查等操作技巧,需要的朋友可以參考下
    2019-11-11
  • Python批量安裝卸載1000個apk的方法

    Python批量安裝卸載1000個apk的方法

    這篇文章主要介紹了Python批量安裝卸載1000個apk的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Python中矩陣創(chuàng)建和矩陣運算方法

    Python中矩陣創(chuàng)建和矩陣運算方法

    今天小編就為大家分享一篇Python中矩陣創(chuàng)建和矩陣運算方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • ansible作為python模塊庫使用的方法實例

    ansible作為python模塊庫使用的方法實例

    ansible是一個python package,是個完全的unpack and play軟件,對客戶端唯一的要求是有ssh有python,并且裝了python-simplejson包,部署上簡單到發(fā)指。下面這篇文章就給大家主要介紹了ansible作為python模塊庫使用的方法實例,需要的朋友可以參考借鑒。
    2017-01-01
  • python 字典 按key值大小 倒序取值的實例

    python 字典 按key值大小 倒序取值的實例

    今天小編就為大家分享一篇python 字典 按key值大小 倒序取值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • pandas中NaN缺失值的處理方法

    pandas中NaN缺失值的處理方法

    當(dāng)我們用python進行數(shù)據(jù)處理時會遇到很多缺失值,對缺失值我們需要進行刪除或者填補,本文主要介紹了pandas中NaN缺失值的處理方法,感興趣的可以了解一下
    2021-05-05
  • python b站視頻下載的五種版本

    python b站視頻下載的五種版本

    該項目用于Bilibili(b站)視頻下載(支持分P多段視頻的下載),基于python開發(fā),有此需求的朋友可以參考下
    2021-05-05
  • python怎么自定義捕獲錯誤

    python怎么自定義捕獲錯誤

    在本篇文章里小編給大家分享了關(guān)于python自定義捕獲錯誤的方法,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06

最新評論

公主岭市| 尼玛县| 中宁县| 花垣县| 富锦市| 邹城市| 丹棱县| 洛宁县| 云浮市| 河池市| 江川县| 博乐市| 临高县| 潮州市| 海门市| 尚义县| 金阳县| 闽清县| 平南县| 锡林浩特市| 门源| 洱源县| 台江县| 湖北省| 肥城市| 米林县| 上犹县| 大名县| 巢湖市| 资中县| 格尔木市| 遂川县| 丰宁| 晋江市| 博客| 沭阳县| 从化市| 玛沁县| 原平市| 微山县| 黄梅县|