制作一个可以显式清除的JSON缓存
我在蓝图上有很多路由,它们的工作方式大致如下:
# 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
ETag
和 Expires
这两个东西就是为了这个目的而设计的:
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