【问题标题】:Choose Mako preprocessor based on file extension?根据文件扩展名选择 Mako 预处理器?
【发布时间】:2012-01-08 04:50:43
【问题描述】:

我想以某种方式对mako.lookup.TemplateLookup 进行检测,使其仅对某些文件扩展名应用某些预处理器。

具体来说,我有一个haml.preprocessor,我想将其应用于文件名以.haml 结尾的所有模板。

谢谢!

【问题讨论】:

    标签: python preprocessor haml mako


    【解决方案1】:

    您应该能够自定义 TemplateLookup 以获得您想要的行为。

    customlookup.py

    from mako.lookup import TemplateLookup
    import haml
    
    class Lookup(TemplateLookup):
        def get_template(self, uri):
            if uri.rsplit('.')[1] == 'haml':
                # change preprocessor used for this template
                default = self.template_args['preprocessor']
                self.template_args['preprocessor'] = haml.preprocessor
                template = super(Lookup, self).get_template(uri)
                # change it back
                self.template_args['preprocessor'] = default
            else:
                template = super(Lookup, self).get_template(uri)
            return template
    
    lookup = Lookup(['.'])
    print lookup.get_template('index.haml').render()
    

    index.haml

    <%inherit file="base.html"/>
    
    <%block name="content">
      %h1 Hello
    </%block>
    

    base.html

    <html>
      <body>
        <%block name="content"/>
      </body>
    </html>
    

    【讨论】:

    • 我终于尝试实现这一点,而不是我使用的 hack,但我遇到了一个问题。这会更改整个查找的预处理器,这会影响继承链中的所有模板。就我而言,我正在慢慢地将模板转换为 HAML,因此大部分链都不是有效的 HAML。
    • 在我的最后两个示例中,haml 预处理器仅在模板具有.haml 扩展名时使用,您应该能够混合使用haml/html 模板。
    • 由于继承或 标签的模板查找使用加载第一个模板的任何查找。如果我 get_template("something.haml") 然后从不是 HAML 的东西继承,它将失败。
    • 应该可以正常工作,不知道你在做什么?我将更新我的示例来说明这一点。
    • 我很方便地读错了你的答案。完全是我的错。在问这个问题之前,我想出了一些与你在这里结束的非常相似的东西。我唯一的改变是在更改 self.template_args['preprocessor'] 周围添加一个 RLock 以避免我所在的线程环境中的竞争条件。干杯!
    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2013-03-18
    • 2018-01-04
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多