axe
Июль 14, 2010 16:03:36
для экспорта
например, phpMyAdmin генерирует файлы на лету.
o7412369815963
Июль 14, 2010 16:41:56
для экспорта данные лучше зажимать архиваторами, для этого нужно целиком данные собрать на диске (что-б память не забивать), а т.к. данные будут на диске то и отдавать веб сервером как статику.
axe
Июль 14, 2010 17:12:27
gzip сжимает данные на лету, тогда и файл рядом с вёб-сервисом не понадобится. это первое.
второе, то что файл у меня на самом деле не генерируется, а вытаскивается из сокета и его размер может быть действительно большим (1Gb, например). было бы странно устраивать перекачку с одного сервера на другой и только после этого отдавать пользователю ссылку. по крайней мере это займёт время, пользователь может просто не дождаться начала скачивания.
третье - файл не должен отдаваться как статика, т.к. должен быть доступен только авторизованному пользователю. и при отмене скачивания, ситуация должна быть корректно обработана и скрипт должен передать соответствующее сообщение серверу, с которого идёт скачивание.
может быть, я и не привёл ни одной достаточной для вас причины, но генерация файлов на лету должна быть, не с пустого места её придумали. отмечу, что ни в mod_python, ни в php никаких проблем с этим нет.
ziro
Июль 14, 2010 17:34:47
axe
Можно ли под wsgi генерировать файлы? Т.е. сгенерировал заголовок файла - отдал, потом генерировать поток данных и отдавать его.
Легко. По спецификации приложение должно возвращать питоновский генератор -
http://www.python.org/dev/peps/pep-0333/#the-application-framework-side (см. AppClass). Так что выдавать по частям вполне можно.
o7412369815963
Июль 14, 2010 17:39:18
а как же обрывы и докачка?
вообще это не веб задача, но http для перекачки архивов подойдет.
axe
Июль 14, 2010 17:54:37
При экспорте данных нельзя делать докачку, т.к. между обращениями данные могли поменяться.
o7412369815963
Июль 14, 2010 17:59:02
с временным файлом докачка была бы.
пока клиент скачивает 2 часа, данные тоже могут поменяться.
вообщем тут уже реализация от цели зависит. задача специфическая.
ziro
Июль 14, 2010 18:26:08
o7412369815963
вообще это не веб задача, но http для перекачки архивов подойдет.
Абсолютно согласен. Лично я бы серьезно расмотрел сохранение файлов на серваке (снижение нагрузки на сервер) и небольшое колдунство с X-Accel-Redirect (для проверки авторизации и отдачи ссылки на файл только проверенным пользователям). Правда пришлось бы по крону потом место чистить время от времени.
Но axe спрашивал про другое, ему видней.
o7412369815963
Июль 14, 2010 18:40:08
ziro
o7412369815963
вообще это не веб задача, но http для перекачки архивов подойдет.
небольшое колдунство с X-Accel-Redirect (для проверки авторизации и отдачи ссылки на файл только проверенным пользователям)
можно штатными средствами вебсерверов, у апача например файл .htaccess сделать.
ещё вариант: имя файла делать ключом (или папку где он лежит) /static/xxhxhxhxhxh.file, и только клиент бует знать путь.
+ для надежности можно ssl прикрутить.
axe
Июль 15, 2010 10:50:58
o7412369815963
пока клиент скачивает 2 часа, данные тоже могут поменяться
Не могут. Запрос для экспорта выполяется 1 раз, и результат сохраняется во временное хранилище внутри базы данных. Такое хранение обеспечивает сама СУБД (тот же MySQL). А дальше уже идёт скачивание информации из этого хранилища. Если скачивание оборвалось, то данные стираются, потому что нет смысла их хранить. Запрос выполянется секунды, а скачивание действительно может идти часами.
Т.е. не важно, изменились ли данные за эти 2 часа, т.к. идёт выкачивание
результата запроса.