Рубрики
Без рубрики

Понять Джанго: Используйте пользовательский файл

В последнюю статью Django вы узнали о настройках Django и как управлять … Помечено Python, Django, файлы.

Понять Django (16 частью серии)

В последнее время Понять Джанго Статья, вы узнали о настройках Django и как управлять конфигурацией вашего приложения. Мы также смотрели на инструменты, чтобы помочь вам быть очень эффективным с настройками.

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

Файлы в моделях Django

Как мы видели в статье моделей, полей модели в модели модели Django в столбец в таблице базы данных. Когда вы хотите получить доступ к данные Для экземпляра модели Django вытягивает данные из строки базы данных.

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

Вместо этого общий шаблон в использовании базы данных – хранить файлы отдельно от самой базы данных. В базе данных столбец будет хранить какой-то Ссылка в хранимую файл, например путь, если файлы хранятся на файловой системе. Это подход, который Django занимает файлы.

Теперь, когда вы знаете, что Django принимает этот подход, вы можете вспомнить:

  1. Модели Django удерживают Ссылка к файлу (например, путь к файлу)
  2. Файл . данные (то есть сам файл) хранится где-то еще.

«Где-то еще» называется «хранение файлов», и мы обсудим хранилище на более глубине в следующем разделе.

Давайте сосредоточимся на первом предмете. Что вы используете для ссылки на файлы? Как и все другие модели данных, мы будем использовать поле! Django включает в себя два поля, которые помогают с управлением файлами:

  • Filefield.
  • ImageField.

Filefield.

Что, если вы хотите сохранить фотографию профиля? Вы можете сделать что-то вроде этого:

# application/models.py

from django.db import models

class Profile(models.Model):
    picture = models.FileField()
    # Other fields like a OneToOneKey to User ...

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

$ ./manage.py shell
>>> from django.core.files import File
>>> from application.models import Profile
>>> f = open('/Users/matt/path/to/image.png')
>>> profile = Profile()
>>> profile.picture.save('my-image.png', File(f))

В этом примере я создаю экземпляр профиля вручную. Есть несколько интересных заметок:

  • Файл Класс – это важная оболочка, которую Django использует для создания объектов Python File Objects (I.E., значение, возвращенное из Open ) Работа с системой хранения.
  • Имя image.png и My-Image.png не нужно соответствовать. Django может хранить содержание image.png и использовать My-Image.png как имя для ссылки в системе хранения.
  • Сохранение изображения автоматически сохранит экземпляр родительской модели по умолчанию.

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

Текущий пример модели поднимает вопросы.

  • Где эти данные идут?
  • Что делать, если у нас есть имя конфликта между двумя файлами типа « My-image.png »?
  • Что произойдет, если мы попытаемся сохранить что-то, что это не изображение?

Если мы не внесем изменений в текущую настройку, данные будут переходить в корню хранения мультимедийных файлов. Это приведет к беспорядку, если вы пытаетесь отслеживать много файловых полей, но мы можем исправить это с Upload_to Аргумент ключевого слова поля. Самая простая версия Upload_to Может пройти строку, которую хранилище будет использовать в качестве префикса каталогов к контенту в другой области.

Мы все еще оставлены с потенциально противоречивыми именами файлов. К счастью, Upload_to Может также принять Callable, который дает нам возможность исправить эту проблему. Давайте переделам пример.

# application/models.py

import uuid
from pathlib import Path
from django.db import models

def profile_pic_path(instance, filename):
    path = Path(filename)
    return "profile_pics/{}{}".format(uuid.uuid4(), path.suffix)

class Profile(models.Model):
    picture = models.FileField(upload_to=profile_pic_path)
    # Other fields like a OneToOneKey to User ...

С этой новой версией модели профиля все изображения будут храниться в profile_pics Путь в хранилище файлов.

Эта версия также решает проблему дублирования файла файла. profile_pic_path Игнорирует большую часть исходного имени файла. Если два пользователя оба случаются загрузки Профиль-pic.jpg , profile_pic_path присваивает эти изображения случайных идентификаторов и игнорируют Профиль-рис часть имени файла.

Вы можете увидеть, что функция звонит UUID4 () Отказ Они эффективно случайные идентификаторы под названием Универально уникальные идентификаторы (UUID) . Ууиды, вероятно, что-то, что вы видели раньше, если вы работали с компьютерами достаточно долго, даже если вы не знали их имя. Пример UUID будет 76ee4ae4-8659-4B50-A04F-E222DF9A656A Отказ В области хранения вы можете найти файл, хранящийся как:

profile_pics/76ee4ae4-8659-4b50-a04f-e222df9a656a.jpg

Каждый звонок на UUID4 () почти наверняка генерирует уникальное значение. Из-за этой функции мы можем избежать конфликтов имени файла, сохраняя фотографии профиля с помощью уникального имени.

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

Это где ImageField имеет ценность. Этот тип поля содержит дополнительную логику проверки, которая может проверить Содержание Из файла, чтобы убедиться, что файл, на самом деле, изображение. Использовать ImageField. вам нужно установить Подушка библиотека. Подушка – это пакет, которая давайте Python работать с данными изображения.

Наш окончательный пример выглядит как:

# application/models.py

import uuid
from pathlib import Path
from django.db import models

def profile_pic_path(instance, filename):
    path = Path(filename)
    return "profile_pics/{}{}".format(uuid.uuid4(), path.suffix)

class Profile(models.Model):
    picture = models.ImageField(upload_to=profile_pic_path)
    # Other fields like a OneToOneKey to User ...

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

Файлы под капотом

Теперь мы знаем, что модели хранят ссылки на файлы, а не сами файлы. Задача хранения файлов делегируется в специальный класс Python в системе.

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

Настройка для управления каким типом хранения файлов Django использует Default_file_storage Отказ Этот параметр – это строка пути модуля Python в определенный класс.

Итак, что такое по умолчанию? По умолчанию – это класс хранения, который будет хранить файлы локально на сервере, который запускает приложение. Это найдено в django.core.files.Storage. FileSystemStorage. . Класс хранения использует пару важных настроек: Media_root и Media_url Отказ

Media_root Настройка определяет, где Django должен искать файлы в файловой системе.

MEDIA_ROOT = BASE_DIR / "media"

На моем компьютере с вышеуказанной настройкой и Профиль Пример класса из ранее Django будет хранить файл где-то, как:

# This path is split to be easier to read.
/Users/matt/example-app/ \
    media/profile_pics/76ee4ae4-8659-4b50-a04f-e222df9a656a.jpg

Другая настройка важной для FileSystemStorage это Media_url Отказ Эти настройки будут определять, как файлы доступны браузерами, когда Django работает. Допустим, Media_url является:

MEDIA_URL = "/media/"

Наша фотография профиля будет иметь URL, как:

>>> from application.models import Profile
>>> profile = Profile.objects.last()
>>> profile.picture.url
'/media/profile_pics/76ee4ae4-8659-4b50-a04f-e222df9a656a.jpg'

Это путь, который мы можем ссылаться на шаблоны. Фрагмент шаблона тегов изображений хотел бы:


Документация Django показывает, как хранилище файлов является определенным интерфейсом. FileSystemStorage Бывает включена в Django и реализует этот интерфейс для более простого механизма хранения, файловой системы операционной системы вашего сервера.

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

Рекомендуемый пакет

Что такое проблема, которая может возникнуть, если вы используете встроенный FileSystemStorage Для хранения файлов для вашего приложения? На самом деле есть много возможных проблем! Вот несколько:

  • Веб-сервер может иметь слишком много файлов и выходить из дискового пространства.
  • Пользователи могут загружать вредоносные файлы, чтобы попытаться получить контроль над вашим сервером.
  • Пользователи могут загружать большие файлы, которые могут привести к атаке отрицания службы (DOS) и сделать ваш сайт недоступным.

Если вы заключите, что FileSystemStorage Не будет работать для вашего приложения, есть еще один хороший вариант? Абсолютно!

Самый популярный пакет для хранения для достижения этого Django-хранилища Отказ Django-хранилища включает в себя набор классов хранения, которые могут подключаться к различным облачным услугам. Эти облачные сервисы могут хранить произвольное количество файлов. С Django-хранилищами ваше приложение может подключиться к услугам, как:

  • Amazon Простая служба хранения (S3)
  • Google Cloud Storage.
  • Цифровые пространства океана
  • Или Услуги, которые вы работаете отдельно, как сервер SFTP

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

Зачем использовать Django-хранилища?

  • Вам никогда не нужно беспокоиться о дисковом пространстве. Облачные сервисы предлагают эффективно неограниченное пространство для хранения, если вы готовы заплатить за это.
  • Файлы будут разделены с вашего веб-сервера Django. Это может устранить некоторые категории проблем безопасности, таких как злонамеренный файл, пытаясь выполнить произвольный код на веб-сервере.
  • Облачное хранилище может предложить некоторые преимущества кэширования и быть легко подключенным к доставкам доставки контента для оптимизации того, как файлы обслуживаются пользователями вашего приложения.

Как и во всех вариантах программного обеспечения, у нас есть компромиссы для рассмотрения при использовании различных классов хранения. На лице Django-хранилищ кажется почти все позитивы. Преимущества поставляются с некоторыми стоимостью сложности установки.

Например, мне нравится использовать Amazon S3 для хранения файлов. Вы можете увидеть из Настройка Amazon S3 Документация о том, что существует справедливое количество работы, чтобы сделать за пределами установки другого Default_file_storage класс. Эта настройка включает в себя настройку AWS частных клавиш, элементы управления доступом, регионами, ведрами и горсткой других важных настроек.

В то время как стоимость установки существует, вы обычно оплачиваете эту стоимость в начале проекта и в основном выключаются после этого.

Django-Storages – это довольно фантастический пакет, поэтому, если ваш проект имеет много файлов для управления, вы должны определенно рассмотреть возможность использования его в качестве альтернативы FileSystemStorage Отказ

Резюме

В этой статье вы узнали о управлении файлами Django. Мы покрыли:

  • Как модели Django поддерживают ссылки на файлы
  • Как файлы управляются в Django
  • Пакет Python, который может хранить файлы в различных облачных услугах

В следующей статье давайте исследуем команды. Команды – код, с которым вы можете работать с ./manage.py Отказ Вы узнаете о:

  • Встроенные команды, предоставленные Django
  • Как построить пользовательские команды
  • Дополнительные команды от сообщества, которые являются полезными расширениями для приложений

Если вы хотите следовать с серией, пожалуйста, не стесняйтесь подписаться на мою рассылку, где я объявляю весь мой новый контент. Если у вас есть другие вопросы, вы можете связаться со мной онлайн в Twitter, где я @mblayman Отказ

Понять Django (16 частью серии)

Оригинал: “https://dev.to/mblayman/understand-django-user-file-use-1am5”