[英]Python: Mako template lookups per app
我正在將Cherryko與Mako用作模板引擎。
我希望Mako根據所請求的應用程序查找不同的目錄。
即我有三個“應用”:站點,管理和安裝。
它們都有自己的模板文件夾,其結構類似於:
/ system包含一些系統范圍的模板,例如404頁等。
在嘗試了解cherrypy / mako的同時,我使用了Twiseless作為參考,但是我對如何做到這一點感到困惑 。
請繼續閱讀,以簡要概述我如何嘗試執行此操作,但請注意:我認為我將完全以錯誤的方式進行操作! :)因此,如果您有任何想法/指針,那么最好自己省下閱讀更多內容的麻煩。
在我的主文件server.py中,執行以下操作:
from libs.plugins.template import MakoTemplatePlugin
engine = cherrypy.engine
makoTemplate = MakoTemplatePlugin(engine, self.base_dir)
setTemplateDirs(makoTemplate, self.template_path)
MakoTemplatePlugin是該插件的稍作修改的版本,其名稱與上面鏈接的Twiseless中的名稱相同。
此代碼的作用是將TemplateLookup設置為使用全局配置文件中的默認模板目錄。 即
然后,每次加載應用程序時,我都會調用一個函數(setTemplateDirs)來更新Mako搜索的目錄。
我以為這可以用,但不能用。 最初,我為每個應用創建一個新的MakoTemplatePlugin實例時出錯。 這只是導致它們在每次頁面加載時都被調用,從實例化的第一個頁面開始,僅包含基本的,非應用程序特定的目錄。
首次調用時,它在錯誤的文件夾中搜索時觸發404錯誤。
相反,我確保將對MakeTemplatePlugin的引用傳遞給所有我的應用程序。 我以為如果每次調用每個應用程序時都運行setTemplateDirs
,這將解決問題……但事實並非如此。
我不知道該函數放在哪里,因此它將在每次請求頁面時運行...
例如
# /apps/site/app.py
import somemodule.setTemplateDirs
class Site(object, params):
def __init__(self):
self.params = params
self.makoTemplate = params['makoTemplate']
self.base_path = params['base_path']
setTemplateDirs(self.makoTemplate, self.base_path, '', '/')
@cherrypy.expose
@cherrypy.tools.render(template='index.html')
def index(self):
pass
顯然,這僅在首次加載應用程序時有效。我嘗試將update函數調用移到單獨的方法update
並嘗試為每個頁面調用它,例如:
@cherrypy.exposed
@cherrypy.tools.render(template='index.html')
@update
def index(self):
pass
但這只是給我與配置有關的錯誤。
與其繼續搞弄這個,還必須有一種更簡單的方法。
你會怎么做?
非常感謝,
湯姆
我工作了。 感謝stephan提供了指向mako工具示例的鏈接: http : //tools.cherrypy.org/wiki/Mako 。
我只是對其稍作修改以使其正常工作。
如果有人想知道,其基礎是您在全局配置中定義tools.mako.directories
,然后可以在單個應用程序配置文件中覆蓋它。
例如
server.conf
...
tools.mako.directories: ['', 'system']
...
site.conf
...
tools.mako.directories: ['site', 'system']
...
我做了一些額外的工作,將相對URI轉換為絕對路徑,但是上面已經解釋了症結所在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.