Python flask передать файл

Обновлено: 04.07.2024

Как загрузить файлы с помощью Python Flask?

Загрузка файлов в колбу-это простая задача. Схема потока выглядит следующим образом:

И это все. Это все, что нам здесь нужно.

1. HTML-формы для загрузки файлов

Для обработки загрузки файлов нам нужно добавить enctype в атрибут формы HTML-шаблона.

Пример HTML-формы выглядит следующим образом:

2. Сохранение файла

В Flask загруженный файл сначала сохраняется во временном расположении на сервере, а затем окончательно сохраняется в месте назначения.

Мы можем указать местоположение назначения и максимальный размер файла в настройках конфигурации Flask:

Мы можем сохранить имя файла назначения либо путем его прямого жесткого кодирования, либо с помощью функции filename .

Всегда рекомендуется использовать защищенную версию загруженного файла с помощью функции secure_filename .

Кодирование формы загрузки файла колбы

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

1. Шаблон формы

Эта простая форма просто принимает файлы, отправленные пользователями. Пожалуйста, ознакомьтесь с нашей статьей О формах колб для получения дополнительной информации о формах колб

2. Кодирование функции просмотра колбы

Теперь добавьте следующий код в приложение Flask

  1. Вид формы отображает форму.
  2. После отправки формы данные формы (загруженный файл) отправляются в представление Upload (как часть объекта запроса) с помощью метода POST .
  3. Представление Upload затем временно сохраняет файл в переменной f , прежде чем окончательно сохранить его с помощью атрибута f.save () .

Пожалуйста, ознакомьтесь с нашей статьей о формах колбы, чтобы узнать больше о формах в колбе.

3. Реализация Кодекса

Запустите сервер и давайте проверим его

Вот и все, файл успешно сохранен. Теперь в вашей папке вы сможете увидеть загруженный файл рядом с файлом приложения Flask.

Вуаля! Ваш файл был успешно загружен.

Вывод

Вот и все для этого урока, ребята! Попробуйте сами примеры, приведенные выше, для лучшего понимания.



Добрый вечер, Хабраюзер. Хочу поделиться небольшим опытом ограничения размера загружаемого файла. Весь опыт получен эмпирическим путем.

  1. В шаблоне создаем формочку с полем для файлов
  2. На сервере проверяем расширение файла и его размер
  3. Если все условия удовлетворяются — загружаем файл и сохраняем ссылку в БД

Начало


По началу все шло просто отлично — и шаблон сделал, и серверную часть накодил, и все загружается — любо-дорого смотреть. Но тут я понимаю, что мне абсолютно не надо, чтообы какой-нибудь добрый человече начал сливать мне 4 гб. траффика на сервер. Гуглим и находим официальный док, в котором видим волшебные строчки:

By default Flask will happily accept file uploads to an unlimited amount of memory, but you can limit that by setting the MAX_CONTENT_LENGTH config key:

Отлично! Добавляем строчку в конфиг, запускаем, и… И получаем ошибку 413… Беда… Гуглим, находим werkzeug.exceptions и RequestEnityTooLarge. Пытаемся завести конструкцию вида

но без результата — браузер не хочет возвращать что-то кроме ошибки. Даже хваленый ничем мне не помог, вывод в консоль не в счет — клиенту это по-барабану.

Продолжение

Ломал голову я дней 5, пока не добрался до начинкиFileStorage. Этот класс наследуется от object и имеет метод read, который производит чтение содержимого в оперативную память. А у этого метода есть необязательный аргумент size, который устанавливает максимальный размер считываемой информации. Отсюда и пляшем.

Набрасываем черновик:

где в переменной MAX_FILE_SIZE указываем максимальный размер файла + 1 байт для отлова превышения. Остальное, думаю, пояснять не надо, если что — воопросы в комментарии.

Набрасываем шаблон:

Запускаем, проверяем. При выдаче файла размером более 1мб. на нас будут кричать, орать и материться, а мы можем довольно потереть руки. Все работает.

Итоги

Что можно сказать про итоги? Возможно, это костыли. Возможно, я чайник, ламер и дно. Но даже в maillist'е разработчиков мне не дали нормального решения данной проблемы.
Впрочем, и у данного решения есть минус, а именно варьирование ограничения и количество оперативной памяти.

На сей ноте хочу распрощаться. Спасибо за то, что прочли, всю критику буду рад выслушать в комментариях. Всем удачи!

Ну да, старая добрая проблема загрузки файлов. Основная мысль загрузки файлов на самом деле очень проста. В общих чертах это работает так:

  1. Тег <form> помечается атрибутом enctype=multipart/form-data , а в форму помещается тег <input type=file> .
  2. Приложение получает доступ к файлу через словарь files в объекте запроса.
  3. Воспользуйтесь методом save() для того, чтобы сохранить временный файл в файловой системе для последующего использования.

Введение¶

Начнём с простейшего приложения, которое загружает файл в определённый каталог и отображает его пользователю. Вот начало нашего приложения:

Сначала нужно выполнить серию импортов. Большая часть понятна, werkzeug.secure_filename() рассматривается чуть позже. UPLOAD_FOLDER - это путь, куда будут загружаться файлы, а ALLOWED_EXTENSIONS - это набор допустимых расширений. Теперь вручную добавим в приложение правило для URL. Обычно мы так не делаем, но почему мы делаем это сейчас? Причина в том, что мы хотим заставить веб-сервер (или наш сервер приложения) обслуживать эти файлы и поэтому нам нужно генерировать правила для связывания URL с этими файлами.

Почему мы ограничили список допустимых расширений? Наверное вам совсем не хочется, чтобы пользователи могли загружать что угодно, если сервер напрямую отправляет данные клиенту. В таком случае вам нужно быть уверенными в том, что пользователи не загрузят файлы HTML, которые могут вызвать проблему XSS (см. Cross-Site Scripting ( xss ) - межсайтовый скриптинг). Также убедитесь в том, что запрещены файлы с расширением .php , если сервер их выполняет. Правда, кому нужен PHP на сервере? :)

Следующая функция проверяет, что расширение файла допустимо, загружает файл и перенаправляет пользователя на URL с загруженным файлом:

Что делает функция secure_filename() ? Мы исходим из принципа «никогда не доверяй тому, что ввёл пользователь». Это справедливо и для имени загружаемого файла. Все отправленные из формы данные могут быть поддельными и имя файла может представлять опасность. Сейчас главное запомнить: всегда используйте эту функцию для получения безопасного имени файла, если собираетесь поместить файл прямо в файловую систему.

Информация для профи

Если считать, что ../ - это нормально, то при соединении этого имени с UPLOAD_FOLDER , пользователь может получить возможность изменять на файловой системе сервера те файлы, который он не должен изменять. Нужно немного разбираться в устройстве вашего приложения, но поверьте мне, хакеры настойчивы :)

Посмотрим, как отработает функция:

Осталась последняя вещь: обслуживание загруженных файлов. Начиная с Flask 0.5 для этого можно использовать соответствующую функцию:

Другая возможность - зарегистрировать uploaded_file с помощью правила build_only и воспользоваться SharedDataMiddleware . Такой вариант будет работать и в более старых версиях Flask:

Теперь, если запустить приложение, всё должно работать как положено.

Улучшение загрузки¶

Добавлено в версии 0.6.

Как на самом деле Flask обрабатывает загрузку? Если файл достаточно мал, он сохраняется в памяти веб-сервера. В противном случае он помещается во временное место (туда, куда укажет tempfile.gettempdir() ). Но как указать максимальный размер файла, после которого загрузка файла должна быть прервана? По умолчанию Flask не ограничивает размер файла, но вы можете задать лимит настройкой ключа конфигурации MAX_CONTENT_LENGTH :

Код выше ограничит максимальный размер файла 16 мегабайтами. Если передаваемый файл окажется больше, Flask сгенерирует исключение RequestEntityTooLarge .

Эта функциональность была добавлена во Flask 0.6, но может быть реализована и в более ранних версиях при помощи наследовании от класса request. За более подробной информацией обратитесь к документации Werkzeug об обработке файлов.

Индикаторы процесса загрузки¶

Многие разработчики придумывают считывать файл мелкими частями, сохранять процент загрузки в базу данных и давать возможность JavaScript считывать эти данные из клиента. Короче говоря, клиент спрашивает у сервера каждые 5 секунд, сколько уже было передано. Почувствовали иронию ситуации? Клиент спрашивает у сервера о том, что уже и так знает.

Сейчас существуют способы получше, которые работают быстрее и более надёжны. В последнее время в вебе многое изменилось и теперь можно использовать HTML5, Java, Silverlight или Flash, чтобы сделать загрузку удобнее со стороны клиента. Посмотрите на следующие библиотеки, предназначенные именно для этого:

Простейшее решение¶

Поскольку общая процедура загрузки файлов остаётся неизменной для всех приложений, занимающихся загрузкой файлов, для Flask есть расширение под названием Flask-Uploads, которое реализует полностью самостоятельный механизм загрузки с белым и чёрным списком расширений и т.п.

Прежде всего, нам нужно установить модуль flask. Вы можете сделать это либо из командной строки, либо с помощью IDE. Я использую PyCharm Community Edition 2017.2. Итак, я установлю Flask с помощью этой IDE.

Затем откройте PyCharm, щелкните файл> настройки. Затем разверните проект и щелкните Project Interpreter. Вы увидите следующее:

Установка Flask в Python

Я уже установил Flask, поэтому в списке отображается Flask. Вы должны нажать кнопку + в правой части окна.

После этого появится окно Доступный пакет. В строке поиска введите Flask, и он появится.

Нажмите на Flask и в нижней части окна нажмите Установить. Flask будет установлен на ваш питон, если вы подключены к Интернету.

Вы можете установить модуль flask, используя команду pip через команду ниже.

Итак, наша установка модуля flask завершена. Теперь приступим к кодированию.

Первая веб-страница

Создайте новый проект с именем FlaskTutorial. Затем я создаю файл с именем Main.py. В этом файле у нас есть следующий сегмент кода:

Затем запустите файл, и в журнале консоли вы увидите следующее:

Пример flask

Итак, это наша основная веб-страница, обслуживаемая Python.

Пояснение

В самой первой строке мы импортировали класс Flask модуля flask.

Тогда @ app.route() – это декоратор, дополняющий функцию index().

Функция index() возвращает строку, которую мы видим на веб-странице. Здесь мы также можем вернуть html-код. Наконец, мы проверяем, работает ли __main__ напрямую или нет. Если да, запустите приложение. Потом видим результат в браузере.

Инструкция по Flask

Теперь давайте посмотрим на другой пример, в котором мы отправим некоторые данные в форму, а затем отобразим их на следующей странице.

отображение данных

Библиотека flask

Теперь напишем код success.html, как показано ниже.

Обратите внимание, что в теге body есть двойная фигурная скобка. В этом электронном письме содержится значение, которое отправляется со страницы входа. Все остальное – как обычный html-код.

Теперь снова вернемся к файлу Main.py, мы должны написать следующий код.

Обратите внимание, что мы добавили еще один маршрут с именем FlaskTutorial. Он принимает другой аргумент с именем methods. В функции возврата мы отправили электронное письмо с именем аргумента, которое мы получаем из текстового поля login.html с помощью action = / FlaskTutorial, и мы встроили его в файл success.html.

Пример работы
Работа с библиотекой

Вот как вы можете отправлять данные из одного HTML-файла в другой HTML-файл с помощью фреймворка Flask.

Читайте также: