У меня есть конечная точка api, которая при вызове инициирует создание отчета. Это трудоемкий процесс, и ответ может прийти довольно поздно. Итак, мы придумали архитектуру кеширования, и после завершения ответ сохраняется в redis.
Однако на стороне интерфейса мы решили время от времени делать запросы, чтобы получить ответ. Чтобы столкнуться с проблемой перекрывающихся запросов, когда один отчет инициализируется несколько раз подряд, я решил создать временный файл, который существует только тогда, когда отчет создается, и ответ api: «Этот отчет уже создается». После завершения генерации файл удаляется, а ответ уже кэшируется.
Это макет того, что я делаю
def post(self):
serialized_data = self.serializer().deserialize({
'task': json.loads(request.values.get('task')),
'media_company': json.loads(request.values.get('mediaCompany'))
})
if not os.path.exists('/root/progress_data'):
os.mkdir('/root/progress_data')
self.build_range(serialized_data)
serialized_data['media_company']['date_from'] = \
self.date_from.strftime("%Y-%m-%d")
serialized_data['media_company']['date_to'] = \
self.date_to.strftime("%Y-%m-%d")
progress_hash = hashlib.sha256(str(serialized_data).encode()).hexdigest()
if self.progress_check(progress_hash):
return json_response({
"success": False,
'result': "This report is already being generated",
})
file = open(f'/root/progress_data/{progress_hash}', 'w+')
file.close()
try:
report = self.generate_report(serialized_data)
except:
os.remove(f'/root/progress_data/{progress_hash}')
return json_response({
"success": False,
'result': "Error while generating report",
})
os.remove(f'/root/progress_data/{progress_hash}')
return json_response({
"success": True,
'data': report,
})
Я думаю, что это не совсем готовое к производству решение, но я не мог придумать что-то лучше.
Кроме того, я думаю, что есть некоторые дыры, из-за которых файл не удаляется во всех случаях.
Не могли бы вы показать мне потенциальные дыры, другой способ проверки прогресса