LINUX.ORG.RU

Генерация CSV отчета на backend и отдача его клиенту на front

 , , ,


1

1

Добрый день. Возникла такая задача. Есть «самописная» веб-админка на VueJS и Backend на Flask. В админке можно ввести поисковый запрос и просмотреть по нему найденные документы, или же просмотреть записи отдельно по месяцам. Возникла необходимость сделать генерацию CSV отчета для клиента по нажатию на кнопку(т.е ему отдается готовый файл). Делаться это будет на стороне сервера. Но как грамотно реализовать отдачу этого файла? Т.е ждать, пока сервер сгенерирует и отдаст файл - явно не самая лучшая затея, думаю. Потому что просто случится большой отчет, а далее timeout и все сломается. Да и хочется сделать «по-грамотному». Правильно ли понимаю, что отдавать клиенту некий id, состояние которого будет проверяться через n-времени (допустим, 0.5 сек) и, когда отчет будет сформирован, просто отдавать прямую ссылку на него?

Если он генерится меньше 10 секунд — можно просто нарисовать крутящийся индикатор и отдать его ответом на запрос.
В любом случае я бы этот отчёт на всякий случай сохранил в ПЗУ и предусмотрел бы запрос статуса его готовности и всё что там дальше следует из этого.

Если генерится очень долго — открывай вебсокет или гоняй запросы статуса аяксом и рисуй прогрессбар. Так же не забудь предусмотреть сценарий в котором юзер закроет вкладку и вернётся за отчётом через два миллиона лет.

А ещё можно отдавать его кусками по мере готовности и складывать в локалсторадж, чтобы не ждать потом ещё пока целый большой кусок траффика скачается. Но это имеет смысл только если он весит дохерища.

Goury ★★★★ ()
Последнее исправление: Goury (всего исправлений: 2)

просто случится большой отчет

Есть точная уверенность, что это не преждевременная оптимизация?

Потому что иначе только вариант с WS или polling, как написано выше.

Octagon ()

1. csv генерят потоково и отдают клиенту по мере формирования.

2. csv годиться только для простых данных, я бы даже сказал не для человека, для человека эксель +100500 раз удобнее ну или xlshtml на худой конец. ( и то и другое тоже генерят потоково)

vtVitus ★★★★★ ()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Если вы это мне вопрос - то как раз таки можно. И в любые скрипты по обработке данных его тоже легко загнать (чего не скажешь о xls, для которого дополнительные библиотеки надо использовать)

crarkie ()

По-грамотному надо делать задание и отдавать через ws ссылку на архив с отчётом, как всё будет готово. И следить, чтобы клиент не запросил несколько одинаковых жирных заданий сразу.

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

Может быть и надо так. Но с WebSocket ни разу не работал. И сейчас ради этого возиться три дня - не хочется. Возможно в будущем буду так и делать. А сейчас - отчет наврятли будет превышать тысяч 10 строк. Поэтому думаю будет достаточно и Chunked Transfering

crarkie ()
Ответ на: комментарий от crutch_master

у каждого продукта свои настройки csv, какая кодировка, что считать разделителем, какой умолчательный формат даты/дробных чисел и правила квотирования, а так же тонна всяких разных тонкостей. У экселя такие настройки и тонкости менялись от версии к версии, а так же не стоит забывать о пользователях гей ос, и на планшетах. xls/xlshtml худо бедно стандарт и все его откроют более менее одинаково.

vtVitus ★★★★★ ()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от crutch_master

чувак, я конечно понимаю, что ты спец во всех вопросах, но ты хоть раз конечному клиенту csv отдавал? Вот как первый раз отдашь, приходи и обсудим все твои благоглупости./thread

vtVitus ★★★★★ ()