Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Web
  • » Экспорт таблицы в csv без создания файла на сервере [RSS Feed]

#1 Апрель 16, 2020 16:15:45

tomahawk
Зарегистрирован: 2020-04-16
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Экспорт таблицы в csv без создания файла на сервере

Уважаемые, направьте меня в правильном направлении.
python+flask

Есть переменная data, где хранится результат запроса в БД.
Есть кнопка, которая запускает функция создания csv, который должен скачиваться сразу.

 @app.route("/export_to_csv")
def export_to_csv():
    try:
        output = io.StringIO()
        writer = csv.writer(output)
        line = ['Дата и время', 'Номер абонента', 'Номер оператора', 'Полная длительность', 'Длительность разговора',
                'Время ожидания', 'Внешний номер']
        writer.writerow(line)
        writer.writerow(line)
        for row in data:
            dataline = [str(row[0]) + ',' + row[1] + ',' + row[2] + ',' + str(row[3]) + ',' + str(row[4]) + ',' + str(row[5]) + ',' + row[6]]
            writer.writerow(dataline)
        output.seek(0)
        output.truncate(0)
        response = Response(output, mimetype='text/csv')
        output.close()
        response.headers.set("Content-Disposition", "attachment", as_attachment=True, attachment_filename="log.csv")
        return response
    except Exception as e:
        print(e)
    finally:
        print('click')
Ошибок нет, но и файла тоже

Офлайн

#2 Апрель 17, 2020 02:29:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Экспорт таблицы в csv без создания файла на сервере

Ряд неправильно формируешь перед записью

  
dataline = [str(row[0]), row[1], row[2], str(row[3]), str(row[4]), str(row[5]), row[6]]

Убери строку с truncate(0).



Офлайн

#3 Апрель 17, 2020 09:52:33

tomahawk
Зарегистрирован: 2020-04-16
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Экспорт таблицы в csv без создания файла на сервере

Спасибо!
Но ничего не изменилось.
PyCharm вываливает в консоль:

127.0.0.1 - - “POST /report1 HTTP/1.1” 200 -
click

и все. Файла нет

Я правильно понимаю, что этот код должен генерировать файл и сохранять его на стороне клиента?

Отредактировано tomahawk (Апрель 17, 2020 11:49:55)

Офлайн

#4 Апрель 17, 2020 12:45:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Экспорт таблицы в csv без создания файла на сервере

Пример генерации данных и передачи их как файла

  
import io
import csv
 
from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def hello():
    return 'Hello World!'
 
@app.route('/report')
def report():
    ofname = 'file.csv'
 
    data_stream = io.StringIO()
    writer = csv.writer(data_stream)
    writer.writerow(['Field1', 'Field2', 'Field3'])
    writer.writerow(['a1', 'b1', 'c1'])
    writer.writerow(['a2', 'b2', 'c2'])
    writer.writerow(['a3', 'b3', 'c3'])
 
    data_stream.seek(0)
    data = data_stream.read()
    datalen = len(data)
    headers = {
        'Content-Disposition': 'attachment; filename={}'.format(ofname),
        'Content-Length': str(datalen),
        'Content-Type': 'text/csv; charset=utf-8'
    }
    response = (data, headers)
    return response


tags: flask file



Отредактировано py.user.next (Апрель 17, 2020 12:45:58)

Офлайн

#5 Апрель 17, 2020 14:34:23

tomahawk
Зарегистрирован: 2020-04-16
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Экспорт таблицы в csv без создания файла на сервере

Спасибо, нашел такое решение - работает!

 def export_to_csv():
    si = io.StringIO()
    cw = csv.writer(si)
    cw.writerows('csvList')
    output = make_response(si.getvalue())
    output.headers["Content-Disposition"] = "attachment; filename=export.csv"
    output.headers["Content-type"] = "text/csv"
    return output

Офлайн

  • Начало
  • » Web
  • » Экспорт таблицы в csv без создания файла на сервере[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version