【问题标题】:Mako avoid python importsMako 避免 python 导入
【发布时间】:2017-09-16 16:48:03
【问题描述】:

我正在尝试使用url_for 等方法创建一个从另一个模板继承的模板。如果我删除 import 语句,我会收到错误:

TypeError
TypeError: 'Undefined' object is not callable

我可以去掉下面的导入吗?

main.html 文件:

<!doctype html>
<%!
    from flask.helpers import url_for
    from flask.globals import request
%>
<html lang=en>

<head>
    <%block name="additional_scripts"/>
</head>
<body>

</body>
<h1>Presence analyzer</h1>
    <ul>
        % for key, template in templates.items():
            <li
                % if request.path == '/statistics/{}/'.format(template['name']):
                    id="selected"
                % endif
            >
                <a href="${url_for('statistics_view', chosen=template['name'])}">${template['description']}</a>
            </li>
        % endfor
    </ul>
</html>

继承文件:

<%inherit file="main.html"/>

<%!
    from flask.helpers import url_for
%>

<%block name="additional_scripts">
    <script type="text/javascript">
        google.load("visualization", "1", {packages:["corechart", "timeline"], 'language': 'pl'});
    </script>
    <script src="${url_for('static', filename='js/presence_weekday.js')}"></script>
</%block>

调用视图方法:

@app.route('/statistics/<chosen>/')
def statistics_view(chosen):
    try:
        return LOOKUP.get_template(templates[chosen]['template']).render(templates=templates)
    except KeyError:
        abort(404)

还有main.py 创建应用的文件:

import os

from flask import Flask
from mako.lookup import TemplateLookup

app = Flask(__name__)  # pylint: disable=invalid-name
LOOKUP = TemplateLookup(directories=[os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                                  'templates')])

【问题讨论】:

    标签: python flask mako


    【解决方案1】:

    我找到了另一种方法来做到这一点。问题是我渲染模板的方式。

    首先我需要在main.py 文件中创建MakoTemplates 实例,方法是添加这一行并删除LOOKUP

    MakoTemplates(app)
    

    然后我没有使用LOOKUP.get_template...,而是返回了:

    return render_template(templates[chosen]['template'], templates=templates)
    

    这让我可以删除这些标签。

    【讨论】:

      【解决方案2】:

      导入是无法避免的,&lt;%! %&gt; 就是所谓的Module-level Blocks,当模板加载到内存时会执行一次。但它不能在模板之间共享。就像 Python 模块的工作原理一样,一切都需要在使用前显式导入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-24
        • 2015-10-29
        • 2019-07-02
        相关资源
        最近更新 更多