2

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

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

4

3 回答 3

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)

现在,当用户在 /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-06-02T08:25:18.127 回答
1

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

于 2013-05-31T12:02:10.550 回答
0

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

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

于 2013-05-31T13:49:02.810 回答