Потоковая передача и загрузка больших файлов 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' %}");
    });
  })

И все работает как надо!

Другие вопросы по тегам