Потоковая передача и загрузка больших файлов CSV с помощью StreamingHttpResponse
Таким образом, проблема, с которой я сталкиваюсь, заключается в том, чтобы попытаться заставить наш веб-сервер экспортировать в кнопку CSV. Одно из требований заключается в том, что файл не может быть сохранен локально и должен передаваться напрямую клиенту. В данный момент я просто пытаюсь получить базовый CSV-файл с потоковой передачей и сохранить на локальном компьютере с сервера, прежде чем беспокоиться о рендеринге реальных данных.
Итак, я кликаю на сообщении в своем просмотре, где я хочу отображать, а затем возвращаю ответ. Это была функция $.ajax, но с тех пор я изменил ее во время тестирования, и теперь она выглядит так:
$("#exportbutton").click(function(e){
$.post("{% url 'doner:download' %}", function(data)
{
console.log(data);
});
})
Код в представлении выглядит следующим образом (который является CTRL+V примера из SO):
def download(request):
def stream():
buffer_ = io.StringIO()
writer = csv.writer(buffer_)
for row in rows:
writer.writerow(row)
buffer_.seek(0)
data = buffer_.read()
buffer_.seek(0)
buffer_.truncate()
yield data
response = StreamingHttpResponse(
stream(), content_type='text/csv'
)
disposition = "attachment; filename=file.csv"
response['Content-Disposition'] = disposition
return response
Таким образом, после долгих попыток это все, что у меня получилось, это "поток" (?) Данных обратно на страницу HTML, console.log выведет данные "файлы", однако я не получаю никакой формы файл или загрузка, просто журнал в консоли данных.
Я не знаю, неправильно ли я понял, как работает StreamingHttpResponse, и я собираюсь сделать что-то большее на стороне клиента, чтобы загрузить его после потока, но я прочитал документы, и я больше не понимаю.
Любая помощь будет принята с благодарностью, как я в тупике, ура ребята!
1 ответ
Проблема, с которой я столкнулся, заключалась в публикации с использованием jQuery, по-видимому, браузер не может загрузить файл с помощью AJAX, поэтому для исправления этой части и загрузки файла все, что я делал, было внутри AJAX (чтобы убедиться, что он сгенерирован правильно перед загрузкой) добавьте строку location.replace('doner/download');
и это было все...
Теперь jQuery выглядит так:
$("#exportbutton").click(function(e){
$.post("{% url 'doner:download' %}", function(data)
{
console.log(data);
location.replace("{% url 'doner:download' %}");
});
})
И все работает как надо!