Печать двоичного ввода-вывода в Python в качестве ответа ajax

#python #excel #ajax #download #buffer

#питон #превосходить #аякс #Скачать #буфер

Вопрос:

Я делаю вызов ajax непосредственно скрипту python и ожидаю в памяти файл excel в качестве ответа.

Аякс:

 $.ajax({  url: 'myscript.py',  type: 'post',  contentType: 'application/json',  cache: false,  xhr: function () {  var xhr = new XMLHttpRequest();  xhr.onreadystatechange = function () {  if (xhr.readyState == 2) {  if (xhr.status == 200) {  xhr.responseType = 'blob';  } else {  xhr.responseType = 'text';  }  }  };  return xhr;  },  data: JSON.stringify( jsonData),  processData: false,  success: function( response, textStatus, jQxhr ){  var blob = new Blob([response], { type: "data:application/vnd.ms-excel" });  var isIE = false || !!document.documentMode;  if (isIE) {  window.navigator.msSaveBlob(blob, fileName);  } else {  var url = window.URL || window.webkitURL;  link = url.createObjectURL(blob);  var a = $("lt;a /gt;");  a.attr("download", fileName);  a.attr("href", link);  $("body").append(a);  a[0].click();  a.remove();  }  },   error: function( jqXhr, textStatus, errorThrown ){  console.log( errorThrown );  }  });  

Контроллер:

 xlsxfile = io.BytesIO() ... print("Content-Type: application/vnd.ms-excelrn") print(xlsxfile.getvalue())  

Как и ожидалось, полученный загруженный файл Excel содержит строку байтов, например

 b'PKx03x04x14x00x00x00x08x00x00x00?x00a]I:Ox01x00x00x8fx04x00x00x13x00x00x00[Content_Types].xmlxadx94xcbnxc20x10Exf7xfdx8axc8xdb*1tQUx15x81Ex1fxcbx16xa9xf4x03....  

Как отправить ответ с python, чтобы ajax правильно обрабатывал тип приложения, а не байтовый литерал, и загрузил соответствующий файл excel? Может ли ajax обрабатывать объект из адреса памяти, например, lt;_io.BytesIO объект в 0x0087C078gt;lt;_io.BytesIO объект в 0x0087C078gt; ?

У меня есть следующие варианты, чтобы разобраться в этом, но я хотел бы знать, возможно ли сделать это так, как я пытаюсь сначала:

  • Настройка веб-сервера python (например, flask) для обработки запросов и ответов
  • Сначала создайте файл физически на сервере и попросите ajax загрузить файл, используя ссылку на файл

Комментарии:

1. Похоже, это недостижимо. Я решил создать файл на сервере и загрузить его с помощью ajax-маршрута.