Безопасная загрузка изображений в веб-приложении на Django
🖼️ 💾 Почти в любом веб-приложении есть необходимость принимать от пользователей картинки. В Django это можно делать лаконично и безопасно, используя ImageField и Pillow.
Загрузка изображений в Django
В Django есть два поля, позволяющих загружать картинки: FileField
и ImageField
. Второй вариант – специализированная версия FileField
, использующая подтверждение от библиотеки Pillow
, что файл является изображением.
Начнем с
создания моделей. Создадим файл models.py
и поместим в него следующее содержимое:
Переменная image
– это
поле ImageField
, которое работает с API хранилища, который обеспечивает способ
хранения/извлечения, а также чтения/записи файлов.
Параметр upload_to
указывает путь, где будут храниться изображения. Для этой модели он будет соответствовать MEDIA_ROOT/images/
Также возможна установка динамических путей для изображений:
Это позволит хранить
изображения в каталогах вида MEDIA_ROOT/users/2020/05/26
.
Установим Pillow
, выполнив следующую команду:
Чтобы Django
обслуживал медиафайлы, загруженные пользователями, добавим следующие настройки
в файл settings.py
вашего проекта:
MEDIA_URL
– это
URL-адрес, который будет обслуживать медиафайлы, а MEDIA_ROOT
– это путь к
корневому каталогу, в котором хранятся файлы.
Добавим следующий код
в urls.py
:
Теперь нам нужно создать форму
для модели изображения. В файл forms.py
добавим следующий код:
Это создаст форму с
полями title
и image
, которые будут отображаться в шаблонах. А сейчас создадим
шаблон для загрузки файлов. В index.html
внесем следующее:
Включение свойства enctype
для формы обеспечивает правильное прикрепление загруженного файла к запросу.
Напишем обработчик формы в views.py
:
Django делает всю
работу сам, а мы просто прогоняем форму через валидацию и сохраняем ее при
успешной загрузке файла. Теперь, когда обработчик готов, сопоставим все
с URL-адресом в urls.py
:
Сохраним файлы, запустим сервер и проверим работу программы.
Заключение
Мы рассмотрели простейший вариант безопасной загрузки картинки на сервер с помощью Django. Вариант прост в реализации и понятен не только для специалистов с опытом. Удачи в обучении.