flask Excel скачать с ajax - PullRequest
       0

flask Excel скачать с ajax

0 голосов
/ 24 января 2020

Я хочу отправить данные от ajax до flask и хочу загрузить эти данные в файл excel для пользователя. ajax отправляет данные, и я также могу распечатать эти данные, но flask не отправляет в браузер этот файл Excel. без ajax flask также работает и отправляет файл Excel, если я беру какие-либо данные, но я хочу опубликовать данные с помощью ajax и получить файл Excel. Пожалуйста, помогите для решения этой проблемы

 **#ajax script**

$('#download').click(function() {
    var date1 ={};
    date1= window.fordownload;
    alert(date1);
    $.ajax({
        url: '/downloads',
        type: "POST",
        data: date1,
        contentType: "application/json; charset=utf-8",
        error: function(e) {
                console.log(e);
        },
        dataType: "json",
        contentType: "application/json"
    });
});


**#flask code**
@app.route('/downloads', methods=['GET','POST'])
def downloadData():
  try:
    json_data = request.get_json('date1')
    print(json_data)
    df_1 = pd.DataFrame(json_data)
    print(df_1)
    output = BytesIO()
    writer = pd.ExcelWriter(output, engine='xlsxwriter')
    df_1.to_excel(writer, startrow=0, merge_cells=False, sheet_name="Sheet_1", index=False)
    workbook = writer.book
    worksheet = writer.sheets["Sheet_1"]
    format = workbook.add_format()
    format.set_bg_color('#eeeeee')
    worksheet.set_column(0, 9, 28)
    writer.close()
    output.seek(0)
    return  send_file(output, attachment_filename="testing.xlsx", as_attachment=True)
  except Exception as e:
    return (str(e))

it отправлять данные от ajax до flask, но

1 Ответ

0 голосов
/ 24 января 2020

У меня уже есть эта проблема, когда вы делаете запрос файла в ajax, вам нужно обработать ответ, это мой код:

this.$http.get(URL.SENSOR_DATA_DOWNLOAD, {
                        params: this.getParms
                    },
                ).then(function (response) {
                    try {
                        let headerLine = response.headers['content-disposition'];
                        let startFileNameIndex = headerLine.indexOf('"') + 1;
                        let endFileNameIndex = headerLine.lastIndexOf('"');
                        let filename = headerLine.substring(startFileNameIndex, endFileNameIndex);
                        const type = response.headers['content-type'];
                        const blob = new Blob([response.data], {type: type, encoding: 'UTF-8'});
                        const link = document.createElement('a');
                        link.href = window.URL.createObjectURL(blob);
                        link.download = filename;
                        link.click();
                    } catch (e) {
                        console.log(e);
                    }
                    this.loading = false;
                }).catch(() => {
                    this.loading = false;
                });

Я использую топор ios, но ответный обратный вызов такой же, как у ajax (часть then(function (response)). В основном я получаю имя файла и данные файла (часть блоба) и помещаю это в ссылку для автоматической загрузки. Если вам тоже нужна внутренняя часть (я использую flask -csv в этом примере):

@api.resource('/sector/machine/sensor/data/download')
class DataDownloadAPI(Resource):
    method_decorators = [login_requeried]

    @validateInput(DownloadDataForm)
    def get(self):
        form = ApiWrap.form
        mintime = datetime.min.time()
        datetime_out = datetime.combine(form.date_out.data + timedelta(days=1), mintime)
        datetime_in = datetime.combine(form.date_in.data, mintime)
        dataStructs = DataModel.between(form.sensor_id.data, datetime_in, datetime_out)
        sensor = Sensor.query.filter_by(id=form.sensor_id.data).first()
        for dataStruct in dataStructs.data:
            dataStruct['datetime'] = dataStruct['datetime'].strftime("%d/%m/%Y, %H:%M:%S")
            dataStruct['value'] = (dataStruct['value'] * sensor.resolution) + sensor.offset

        return send_csv(dataStructs.data,
                        sensor.name + datetime_out.strftime("%d/%m/%Y") + '.csv',
                        ['datetime', 'value'], delimiter=';')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...