【问题标题】:How to reload a Flask app each time it's accessed如何在每次访问 Flask 应用程序时重新加载它
【发布时间】:2016-11-26 04:07:33
【问题描述】:

我有一个使用 /get_data 端点访问的烧瓶应用程序,并提供一个数字作为 id (127.0.0.1:55555/get_data=56)

@app.route('/get_data=<id>') 
def get_vod_tree(id):
    ...
    return render_template('index.html') 

它调用一个函数,该函数获取该 id 下的一些数据并使用收集的数据创建一个 json 文件 [static/data.json],然后返回 render_template('index.html')。

在 index.html 中有一个对 ../static/data_tree.js 的调用,它依次读取 json 文件并使用 d3.js 在浏览器中输出可视化。

当应用程序运行时,即使我使用不同的 id 并且 json 文件发生更改,我也会在浏览器上获得相同的输出。仅当我重新加载应用程序然后访问 url 时才有效。

我的问题是: 如何确保多个用户根据 id 获得不同的输出,或者当我到达端点时如何重新加载应用程序。

事后思考:如果多个用户正在使用该应用程序,那么每次只创建一个文件

【问题讨论】:

  • 您是如何将数据导入 index.html 的?
  • 我不明白你的流程。为什么每次都覆盖单个文件而不是保留所有 data.json 并将 id 传递给模板?我能看到的唯一原因是因为数据可以在连续调用之间发生变化,但是为什么不直接将它传递给模板呢?
  • @polku 是的,数据发生了变化,但它也是使用格式化获取的 json 数据的 python 函数收集的。

标签: python d3.js flask


【解决方案1】:

感谢您的回答。它有助于深入了解这一点。它现在是这样工作的:

@app.after_request
def apply_caching(response):
    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
    return response

因此,通过禁用缓存,应用程序可以将每个请求视为唯一的。

【讨论】:

    【解决方案2】:

    如果您在测试/开发环境中设置app.run(debug=True),它会在每次代码更改发生时自动重新加载您的 Flask 应用程序。

    要在静态文件更改时重新加载应用程序,请使用extra_files 参数。见here

    示例代码:

    extra_dirs = ['directory/to/watch',]
    extra_files = extra_dirs[:]
    for extra_dir in extra_dirs:
        for dirname, dirs, files in os.walk(extra_dir):
            for filename in files:
                filename = path.join(dirname, filename)
                if path.isfile(filename):
                    extra_files.append(filename)
    app.run(extra_files=extra_files)
    

    Source

    【讨论】:

    • 这不包括静态文件的更改。看起来有些缓存机制已经到位。
    • @case 你是怎么调用服务器的?
    • 我在浏览器中使用127.0.0.1:55555/get_data=56,数据是从测试服务器上的 URL 获取的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多