我正在编写一个应用程序来选择性地列出目录中的文件。我希望用户打开HTML文件并在Python遍历目录并收集信息时收到消息“正在更新...”。当python完成时,页面将填充文件列表。可能在HTML中使用Python和Jinja2刷新网页?
Jinja2可能吗?阅读它,它看起来像很多人使用它从Python生成HTML文件。我想通过使用它在HTML中调用Python来做一些稍微不同的事情。或者,我应该采取另一种方法?任何建议将不胜感激。
我正在编写一个应用程序来选择性地列出目录中的文件。我希望用户打开HTML文件并在Python遍历目录并收集信息时收到消息“正在更新...”。当python完成时,页面将填充文件列表。可能在HTML中使用Python和Jinja2刷新网页?
Jinja2可能吗?阅读它,它看起来像很多人使用它从Python生成HTML文件。我想通过使用它在HTML中调用Python来做一些稍微不同的事情。或者,我应该采取另一种方法?任何建议将不胜感激。
Jinja2本身只是一种模板语言。为了用您的Python应用程序中的数据重新填充HTML的一部分,我将使用像jQuery这样的JavaScript库,它可以通过AJAX检索数据并用结果修改DOM。例如,您的初始页面将在div
元素中显示“正在更新...”。 jQuery对您的应用的URL进行AJAX调用,以读取目录并发送HTML格式的字符串(可能还通过Jinja呈现),结果将取代“更新”div
的内容。
如果您希望用户接收更新,则必须使用通道API。通道API可以将任务中的更新从客户端发送到JavaScript。
看到这个博客帖子:http://blog.notdot.net/2011/07/Using-the-Channel-API-on-App-Engine-for-instant-traffic-analysis
不能从呈现模板执行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)
现在,当用户在/目录进入你的基本页面,他/她看到你那还不包含有关目录数据的任何基本的模板。为了解决这个问题,您可以在文档完成加载后执行Javascript,并通过使用Ajax进行HTTP GET来获取内容。因此,像这样:
的JavaScript + jQuery的从“directories.html”之称:
$('#message-box').html('Updating...');
$.get('/directories/fragment', function(data) {
$('#result-box').html(data);
$('#message-box').html('All done!');
});
这样的想法是与Python服务的基本页面,然后使用客户端的JavaScript来获取“动态“内容。请注意,我只是把它们扔在一起,所以它可能在某处丢失了一个圆括号或两个圆括号,您应该添加适当的错误处理和所有爵士乐。
将render_template作为html片段返回的技巧帮助了我很多!谢谢 – Gyfis
您无法从HTML执行Python代码。要做到这一点,你必须运行一个服务器。 – michaelmeyer