我正在编写一个应用程序来有选择地列出目录中的文件。我希望用户打开一个HTML文件,并得到一条消息“正在更新...”而Python遍历目录并收集信息。当python完成时,页面将填充文件列表。
使用Jinja2可以做到这一点吗?仔细阅读它,似乎很多人都在使用它从Python生成HTML文件。我想做一些稍微不同的事情,使用它在HTML中调用Python。或者,也许我应该采取另一种方法?任何建议都将不胜感激。
发布于 2013-06-02 16:25:18
您不能从呈现的模板执行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获取“动态”内容。请注意,我只是把它拼凑在一起,所以它可能在某个地方遗漏了一两个括号,您应该添加适当的错误处理和所有这些东西。
发布于 2013-05-31 20:02:11
Jinja2本身只是一种模板语言。为了用Python应用程序中的数据重新填充HTML的一部分,我将使用jQuery这样的JavaScript库,它可以通过AJAX检索数据并使用结果修改DOM。例如,初始页面将显示“正在更新…”。在div元素中。jQuery向应用程序的URL发出AJAX调用,该应用程序读取目录并发送一个超文本标记语言格式的字符串(可能也是通过Jinja呈现的),结果将替换“更新”div的内容。
发布于 2013-05-31 21:49:03
如果您希望用户接收更新,则必须使用通道API。通道API可以将更新从任务发送到客户端中的javascript。
请看这篇博文:http://blog.notdot.net/2011/07/Using-the-Channel-API-on-App-Engine-for-instant-traffic-analysis
https://stackoverflow.com/questions/16855993
复制相似问题