首页 > 解决方案 > 如何不断更新 Flask 中视图函数中使用的变量?

问题描述

我有一个运行仪表板的 Flask 应用程序,仪表板的某些部分使用日期作为输入表单来过滤来自数据库的数据。但是,如果用户没有输入日期作为请求 arg,那么路由将返回一个模板,该模板以表gps_data中的最后一个可用日期呈现。

我有仪表板索引的下一条路线,可以按我的意愿工作:

import psycopg2 as pg2

@bp.route("/index", methods=["GET", "POST"])
def index():
    date = request.args.get("date")  # date form input
    imei = request.args.get("imei")  # imei form input

    # if the user request 'index' without any date use last date from the table gps_data
    if not date:
        cur = conn.cursor() # psycopg2 cursor to postgresql database
        query = """SELECT
                       max(timestamp_utc::date)
                   FROM
                       gps_data
                   WHERE imei = imei%s
                """
        try:
            # gps_data_last_date
            cur.execute(query, imei)
            date = cur.fetchall()[0][0]
        except Exception as e:
            conn.rollback()
            date = None
            print(e)
        else:
            conn.commit()

        return redirect(url_for("dashboard.index", date=date))

    return render_template(
        "dashboard.html",
        date=date
    )

但问题是我不想在用户加载仪表板页面时获得最大日期,因为表 gps_data 非常大,加载页面时的性能可能会受到影响。所以我想使用一种后台任务来更新全局变量中的最大日期或类似的东西(例如每天一次),避免查询数据库表gps_data

我已经研究过哪种方法是实现这一目标的最佳方法,似乎有两种选择:

  1. 添加Celery + Redis,并在 Flask 中设置一个 Celery 周期性任务,然后从 Redis 中读取视图函数中的日期。
  2. 像这个答案一样向 Flask 添加一个后台线程,并从全局变量中读取视图函数中的日期。
  3. 继续使用 SQL 表 gps_data 但在列timestamp_utcimei.

您知道是否有比这两个更好或更有效的选择?如果没有其他选择,您认为这两个选项中哪一个是最好的?

编辑:添加了第三个选项

标签: pythonflaskcelerybackground-process

解决方案


推荐阅读