В python с использованием Flask, как я могу записать объект для загрузки?

Я использую Flask и работаю с мастером. Я данные, которые я построил в памяти, и я хочу, чтобы пользователь мог загрузить эти данные в текстовом файле. Я не хочу записывать данные в файл на локальном диске и делать его доступным для загрузки.

Я новичок в питоне. Я думал, что создам какой-нибудь файловый объект в памяти, а затем установим заголовок ответа, может быть?


person swidnikk    schedule 28.08.2012    source источник


Ответы (1)


Потоковая передача файлов клиенту без сохранения их на диск описана в разделе «Шаблоны» документации Flask, в частности, в разделе стриминга. По сути, вы возвращаете полноценный объект Response, обертывающий ваш итератор. :

from flask import Response

# construct your app

@app.route("/get-file")
def get_file():
    results = generate_file_data()
    generator = (cell for row in results
                    for cell in row)

    return Response(generator,
                       mimetype="text/plain",
                       headers={"Content-Disposition":
                                    "attachment;filename=test.txt"})
person Sean Vieira    schedule 29.08.2012
comment
Я понятия не имею, что делает ячейка для строки в результатах... не могли бы вы объяснить? - person swidnikk; 30.08.2012
comment
@swidnikk - это выражение генератора - оно похоже на выражение понимания списка [x for x in range(10)], за исключением того, что оно создает объект генератора, а не список. (x for x in range(10)) не генерирует весь список сразу. Вместо этого он лениво оценивает следующее значение x каждый раз, когда вызывается __next__ (next в Python 2.X). В документах показан другой способ создания генераторов с использованием yield (def generator_func(): for x in range(10): yield x). Вложенные выражения for существуют, потому что я предположил, что структура данных представляет собой список списков. Имеет ли это смысл? - person Sean Vieira; 30.08.2012
comment
Спасибо. Я не знал, как найти дополнительную информацию. Теперь я понимаю и нашел его в документах здесь: docs.python.org/tutorial/classes .html#generators Полагаю, это будет особенно полезно, если создаваемый файл станет слишком большим для хранения в памяти. - person swidnikk; 30.08.2012