Альтернатива send_file () во флешке на Pythonanywhere? - PullRequest
0 голосов
/ 29 апреля 2018

Я новичок в Python и все еще учусь. Я создал небольшое веб-приложение Python 3.6 Flask на pythonanwhere и обнаружил, что send_file () не работает на серверах pythonanywhere. Я активно ищу альтернативу для загрузки файла Excel прямо на компьютер пользователя. Я также попытался Response , но он не дает желаемого результата. Я много читал об этом в Интернете и обнаружил, что send_file работает нормально, если мы установим ниже

wsgi-disable-file-wrapper = True

Однако я не знаю, где это установить, так как я не смог найти файл uWsgi.ini, где я мог бы обновить эту строку.

Ниже приведены методы, которые я пробовал, но они не помогли, пожалуйста, помогите

Конфигурация SEND_FILE (): - >>> Не работает ..

    output = BytesIO()
    writer = pd.ExcelWriter(output, engine='xlsxwriter')
    workbook = writer.book
    output.seek(0)
    return send_file(output,attachment_filename="testing.xlsx",as_attachment=True)

Ошибка вывода:

return environ.get('wsgi.file_wrapper', FileWrapper)(file, buffer_size)
SystemError: <built-in function uwsgi_sendfile> returned a result with an error set

С конфигурацией ответа:

writer = pd.ExcelWriter("abc.xlsx", engine='xlsxwriter')

return Response(writer,mimetype="text/csv",headers={"Content-disposition":"attachment; filename=myplot.csv"})

Ошибка вывода:

Error running WSGI application
TypeError: '_XlsxWriter' object is not iterable
File "/home/hridesh1987/.virtualenvs/myproject/lib/python3.6/site-packages/werkzeug/wsgi.py", line 870, in __next__return self._next()
File "/home/hridesh1987/.virtualenvs/myproject/lib/python3.6/site-packages/werkzeug/wrappers.py", line 83, in _iter_encoded
for item in iterable:

1 Ответ

0 голосов
/ 29 ноября 2018

Я поднял ту же проблему на форумах PythonAnywhere, и они дали мне этот ответ . Престижность сотрудникам PythonAnywhere.

Копия вставили:

from io import BytesIO
from flask import Flask, Response
from werkzeug import FileWrapper

app = Flask(__name__)

@app.route('/')
def hello_world():
    b = BytesIO(b"blah blah blah")
    w = FileWrapper(b)
    return Response(w, mimetype="text/plain", direct_passthrough=True)

Я немного адаптировал его для своего использования. Я установил имя файла через заголовок Content-Disposition. Мне также пришлось настроить импорт FileWrapper, и data уже является объектом BytesIO в моем коде:

from flask import Response
from werkzeug.wsgi import FileWrapper

def send_excel_file(data, filename):
    # See: https://www.pythonanywhere.com/forums/topic/13570/
    file_wrapper = FileWrapper(data)
    headers = {
        'Content-Disposition': 'attachment; filename="{}"'.format(filename)
    }
    response = Response(file_wrapper,
                        mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                        direct_passthrough=True,
                        headers=headers)
    return response
...