Mako 避免 python 进口
Mako avoid python imports
我正在尝试使用 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')])
导入是不可避免的,<%! %>
就是所谓的Module-level Blocks,模板加载到内存时会执行一次。但它不能在模板之间共享。正如 Python 模块的工作方式一样,所有内容都需要在使用前明确导入。
我找到了另一种方法。问题是我呈现模板的方式。
首先,我需要通过添加此行并删除 LOOKUP
:
在 main.py
文件中创建 MakoTemplates
实例
MakoTemplates(app)
然后我没有使用 LOOKUP.get_template...
,而是返回了:
return render_template(templates[chosen]['template'], templates=templates)
这允许我删除这些标签。
我正在尝试使用 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')])
导入是不可避免的,<%! %>
就是所谓的Module-level Blocks,模板加载到内存时会执行一次。但它不能在模板之间共享。正如 Python 模块的工作方式一样,所有内容都需要在使用前明确导入。
我找到了另一种方法。问题是我呈现模板的方式。
首先,我需要通过添加此行并删除 LOOKUP
:
main.py
文件中创建 MakoTemplates
实例
MakoTemplates(app)
然后我没有使用 LOOKUP.get_template...
,而是返回了:
return render_template(templates[chosen]['template'], templates=templates)
这允许我删除这些标签。