首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mako避免python导入

Mako避免python导入
EN

Stack Overflow用户
提问于 2017-04-20 07:30:54
回答 2查看 432关注 0票数 0

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

代码语言:javascript
复制
TypeError
TypeError: 'Undefined' object is not callable

我能在下面处理进口商品吗?

main.html文件:

代码语言:javascript
复制
<!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>

继承文件:

代码语言:javascript
复制
<%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>

调用视图方法:

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

以及创建app的main.py文件:

代码语言:javascript
复制
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')])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-20 08:32:49

我找到了另一种方法来做这个。问题在于我呈现模板的方式。

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

代码语言:javascript
复制
MakoTemplates(app)

然后,我不再使用LOOKUP.get_template...,而是返回:

代码语言:javascript
复制
return render_template(templates[chosen]['template'], templates=templates)

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

票数 0
EN

Stack Overflow用户

发布于 2017-04-20 08:15:53

导入是无法避免的,<%! %>被称为模块级块,当模板加载到内存中时,它将被执行一次。但是它不能在模板之间共享。正如Python模块的工作方式一样,在使用之前,需要明确地导入所有内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43512956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档