可以在HTML中使用Python和Jinja2刷新网页吗?

时间:2013-05-31 11:14:54

标签: python html python-3.x jinja2

我正在编写一个应用程序来有选择地列出目录中的文件。我希望用户打开一个HTML文件,并在Python浏览目录并收集信息时收到消息“正在更新...”。当python完成时,页面将填充文件列表。

Jinja2可以实现吗?阅读它,看起来很多人使用它从Python生成HTML文件。我想通过使用它在HTML中调用Python来做一些稍微不同的事情。或许我应该采取另一种方法?任何建议将不胜感激。

3 个答案:

答案 0 :(得分:3)

您无法从呈现的模板执行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来获取内容。所以像这样:

从“directories.html”调用Javascript + jQuery:

$('#message-box').html('Updating...');

$.get('/directories/fragment', function(data) {
  $('#result-box').html(data);
  $('#message-box').html('All done!');
});

因此,我们的想法是使用Python提供基本页面,然后使用客户端Javascript来获取“动态”内容。请注意,我只是把它放在一起,所以它可能会丢失一个或两个括号,你应该添加适当的错误处理和所有的爵士乐。

答案 1 :(得分:1)

Jinja2本身只是一种模板语言。要使用Python应用程序中的数据重新填充HTML的一部分,我将使用像jQuery这样的JavaScript库,它可以通过AJAX检索数据并使用结果修改DOM。例如,您的初始页面会在div元素中显示“正在更新...”。 jQuery对你的应用程序的URL进行AJAX调用,该URL读取目录并发送HTML格式的字符串(也许也通过Jinja呈现),其结果将替换“更新”div的内容。

答案 2 :(得分:0)

如果您希望用户接收更新,则必须使用渠道API。通道API可以将更新从任务发送到客户端中的javascript。

请参阅此博文:http://blog.notdot.net/2011/07/Using-the-Channel-API-on-App-Engine-for-instant-traffic-analysis