Как избежать тайм-аута при создании большого CSV с помощью python?
Для проекта мне нужно реализовать экспорт CSV из большой базы данных. Мой проект Django размещен на Azure, и каждый раз я получаю ошибку таймаута...
Думаю, мне нужно реализовать асинхронную функцию или что-то в этом роде.
Я пробовал async_to_sync и sync_to_async, запуск с сервера Daphne, StreamingHttpResponse...
Вот код:
class Echo:
"""An object that implements just the write method of the file-like
interface.
"""
def write(self, value):
"""Write the value by returning it, instead of storing in a buffer."""
return value
@api_view(['POST'])
@permission_classes((permissions.IsAuthenticated,))
def export_csv(request):
try:
# long task
first_item, second_item, third_item = my_function(request.data)
csv_tab = []
csv_tab.append(build_headers())
# long task
for item in first_item:
csv_tab.extend(build_lines(item, second_item, third_item))
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer, delimiter=';')
response = StreamingHttpResponse(
(writer.writerow(line) for line in csv_tab),
content_type='text/csv',
headers={
'Content-Disposition': 'attachment; filename="somefilename.csv"'},
)
return response
except Exception as identifier:
LOGGER.exception(identifier)
current = {
'state': "failure",
'reason': "server error",
}
print(identifier)
return HttpResponse(json.dumps(current), status=500)
Если ваш запрос занимает много времени, вам следует использовать библиотеку фоновых задач, например celery
.
В зависимости от варианта использования, вы можете отправить результат по электронной почте после вычисления или сгенерировать некий идентификатор или токен и перенаправить пользователя на промежуточную страницу, которая указывает, продолжается ли обработка или результаты готовы для загрузки.