制作一个可以显式清除的JSON缓存

2 投票
2 回答
1613 浏览
提问于 2025-04-18 08:25

我在蓝图上有很多路由,它们的工作方式大致如下:

# charts.py
@charts.route('/pie')
def pie():
  # ...
  return jsonify(my_data)

这些数据来自一个CSV文件,这个文件是由一个独立的脚本每隔一段时间(比如每几个小时)抓取一次的。然后,应用程序通过一个类来读取这些数据,这个类会和蓝图绑定在一起。

# __init__.py
from flask import Blueprint
from helpers.csv_reader import CSVReader

chart_blueprint = Blueprint('chart_blueprint', __name__)
chart_blueprint.data = CSVReader('statistics.csv')

from . import charts

我的目标是缓存这些路由的多个响应,因为数据是不会变化的。不过,更棘手的问题是,如何在我的抓取脚本完成后,明确地清除这些缓存的数据。

我该怎么做呢?我有点迷茫,但我想我需要在我的蓝图上注册一个 before_request 的功能。

2 个回答

1

Sean的回答对于那些在下一批数据读取之前就回来请求相同信息的客户来说非常好,但对于那些第一次来的客户就没什么帮助了。

对于新客户,你可以使用像redis或memcached这样的缓存服务器,它们可以存储预先计算好的结果。这些服务器其实就是简单的键值存储,但速度非常快。你甚至可以设置这些值在过期之前能保持有效多久。

缓存服务器在计算结果需要花费时间或计算资源很高的情况下很有帮助,但如果你只是从文件中返回数据,那效果就不会太明显。

这里有一个使用werkzeug缓存接口的flask模式的链接 flask模式,还有一个关于 flask缓存扩展 的链接。

1

ETagExpires 这两个东西就是为了这个目的而设计的:

class CSVReader(object):
    def read_if_reloaded(self):
        # Do your thing here
        self.expires_on = self.calculate_next_load_time()
        self.checksum = self.calculate_current_checksum()


@charts.route('/pie')
def pie():
  if request.headers.get('ETag') == charts.data.checksum:
      return ('', 304, {})
  # ...
  response = jsonify(my_data)
  response.headers['Expires'] = charts.data.expires_on
  response.headers['ETag'] = charts.data.checksum
  return response

撰写回答