我正在编写一个应用程序来选择性地列出目录中的文件。我希望用户打开一个 HTML 文件并在 Python 遍历目录并收集信息时收到一条消息“正在更新...”。当 python 完成时,页面将填充文件列表。
Jinja2 有可能吗?阅读它,看起来很多人使用它从 Python 生成 HTML 文件。我想通过使用它在 HTML 中调用 Python 来做一些稍微不同的事情。或者也许我应该采取另一种方法?任何建议将不胜感激。
我正在编写一个应用程序来选择性地列出目录中的文件。我希望用户打开一个 HTML 文件并在 Python 遍历目录并收集信息时收到一条消息“正在更新...”。当 python 完成时,页面将填充文件列表。
Jinja2 有可能吗?阅读它,看起来很多人使用它从 Python 生成 HTML 文件。我想通过使用它在 HTML 中调用 Python 来做一些稍微不同的事情。或者也许我应该采取另一种方法?任何建议将不胜感激。
您无法从呈现的模板执行 Python,但您可以通过将 Python 与 Javascript 结合使用来做您想做的事情。我将使用 Flask 作为示例 Web 框架,但即使您不特别熟悉 Flask,也应该很清楚它的作用。
这个想法是你有两个路线/地址。一个为您提供基本视图,您希望您的“更新...”事情发生。另一条路由返回一个 HTML 片段,该片段由呈现为合适的 HTML 表示的目录数据组成。所以是这样的:
Python:
def _walk_through_directories():
"""
Walk through directories and gather the
data you want and return it in some collection
for example.
"""
...
return directory_data
@app.route('/directories')
def directories():
return render_template('directories.html')
@app.route('/directories/fragment')
def directories():
directory_data = _walk_through_directories()
return render_template('directories_fragment.html',
directory_data=directory_data)
现在,当用户在 /directories 处进入您的基本页面时,他/她会看到您的基本模板,其中还没有包含有关目录数据的任何内容。为了解决这个问题,您可以在文档加载完成后执行 Javascript,并通过使用 Ajax 执行 HTTP GET 来获取内容。所以是这样的:
从“directories.html”调用的 Javascript + jQuery:
$('#message-box').html('Updating...');
$.get('/directories/fragment', function(data) {
$('#result-box').html(data);
$('#message-box').html('All done!');
});
所以这个想法是用 Python 提供基本页面,然后使用客户端 Javascript 来获取“动态”内容。请注意,我只是把它放在一起,所以它可能在某处缺少一两个括号,你应该添加适当的错误处理和所有爵士乐。
Jinja2本身只是一种模板语言。为了使用 Python 应用程序中的数据重新填充 HTML 的一部分,我将使用像 jQuery 这样的 JavaScript 库,它可以通过 AJAX 检索数据并使用结果修改 DOM。例如,您的初始页面将在div
元素中显示“正在更新...”。jQuery 对您的应用程序的 URL 进行 AJAX 调用,该 URL 读取目录并发送 HTML 格式的字符串(可能也通过 Jinja 呈现),其结果将替换 "updating" 的内容div
。
如果您希望用户接收更新,则必须使用频道 API。通道 API 可以将来自任务的更新发送到客户端中的 javascript。
请参阅此博文:http: //blog.notdot.net/2011/07/Using-the-Channel-API-on-App-Engine-for-instant-traffic-analysis