Проверка расширения файла django

Обновлено: 04.07.2024

Моя цель - ограничить FileField в Django ModelForm для PDF файлов и документов Word. Ответы, с которыми я столкнулся, касаются создания отдельного обработчика файлов, но я не уверен, как это сделать в контексте ModelForm. Есть ли параметр в settings.py, который я могу использовать для ограничения типов файлов загрузки?

Я обрабатываю это, используя метод clean_ [your_field] в ModelForm. Вы можете установить список допустимых расширений файлов в settings.py для проверки в своем чистом методе, но нет ничего встроенного в settings.py для ограничения типов загрузки.

Django-Filebrowser, например, использует подход к созданию списка допустимых расширений файлов в settings.py.

Надеюсь, что это поможет тебе.

Создайте метод проверки, например:

и включите его в валидаторы FileField, например:

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

Изменить

Чтобы фильтровать несколько файлов:

Проверка с расширением имени файла не является последовательным способом. Например, я могу переименовать picture.jpg в picture.pdf, и проверка не приведет к ошибке.

Лучший подход - проверить содержимое content_type файла.

Метод проверки

Использование

Теперь вы можете определить встроенный валидатор с полем, например:

Более простой способ сделать это, как показано ниже в вашей форме

Я использую что-то в этих строках (обратите внимание: для этого требуется "pip install filemagic" ):

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

Примечание. Это функция валидатора, которую вы хотите добавить в список валидаторов для модели FileField.

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

Например, вот валидатор, который допускает только четные числа:

Вы можете добавить это к полю модели через аргумент поля validators :

Поскольку значения преобразуются в Python до запуска валидаторов, вы можете использовать один и тот же валидатор даже с формами:

Вы также можете использовать класс с методом __call__() для более сложных или настраиваемых валидаторов. Например, RegexValidator использует эту технику. Если в опции поля модели validators используется валидатор на основе класса, необходимо убедиться, что он serializable by the migration framework , добавив методы deconstruct() и __eq__() .

Как работают валидаторы¶

Смотрите form validation для получения дополнительной информации о том, как запускаются валидаторы в формах, и Validating objects для того, как они запускаются в моделях. Обратите внимание, что валидаторы не будут запускаться автоматически при сохранении модели, но если вы используете ModelForm , он будет запускать ваши валидаторы на всех полях, включенных в вашу форму. См. ModelForm documentation для получения информации о том, как валидация модели взаимодействует с формами.

Встроенные валидаторы¶

Модуль django.core.validators содержит коллекцию вызываемых валидаторов для использования с полями моделей и форм. Они используются внутри модуля, но доступны и для использования с вашими собственными полями. Их можно использовать в дополнение или вместо пользовательских методов field.clean() .

RegexValidator ¶

  • regex – Если не None , переопределяет regex . Может быть строкой регулярного выражения или предварительно скомпилированным регулярным выражением.
  • message – Если не None , переопределяет message .
  • code – Если не None , переопределяет code .
  • inverse_match – Если не None , переопределяет inverse_match .
  • flags – Если не None , переопределяется flags . В этом случае regex должно быть строкой регулярного выражения, иначе возникает TypeError .

RegexValidator ищет в предоставленном value для заданного регулярного выражения с re.search() . По умолчанию выдает ValidationError с message и code , если совпадение не найдено. Его поведение можно изменить, установив inverse_match в True , в этом случае ValidationError будет вызвано, когда совпадение найдено.

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "invalid" .

Режим соответствия для regex . По умолчанию False .

regex flags используется при компиляции строки регулярного выражения regex . Если regex является предварительно скомпилированным регулярным выражением, а flags переопределяется, то поднимается TypeError . По умолчанию используется 0 .

EmailValidator ¶

  • message – Если не None , переопределяет message .
  • code – Если не None , переопределяет code .
  • whitelist – Если не None , переопределяет whitelist .

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "invalid" .

URLValidator ¶

class URLValidator ( schemes = None , regex = None , message = None , code = None ) [исходный код] ¶

Подкласс RegexValidator , который гарантирует, что значение выглядит как URL, и выдает код ошибки 'invalid' , если это не так.

В дополнение к необязательным аргументам своего родительского класса RegexValidator , URLValidator принимает дополнительный необязательный атрибут:

validate_email ¶

Экземпляр EmailValidator без каких-либо настроек.

validate_slug ¶

Экземпляр RegexValidator , который гарантирует, что значение состоит только из букв, цифр, подчеркивания или дефиса.

validate_unicode_slug ¶

Экземпляр RegexValidator , который гарантирует, что значение состоит только из букв Юникода, цифр, подчеркиваний или дефисов.

validate_ipv4_address ¶

Экземпляр RegexValidator , который гарантирует, что значение выглядит как IPv4-адрес.

validate_ipv6_address ¶

Использует django.utils.ipv6 для проверки достоверности IPv6-адреса.

validate_ipv46_address ¶

Использует validate_ipv4_address и validate_ipv6_address , чтобы убедиться, что значение является действительным IPv4 или IPv6 адресом.

validate_comma_separated_integer_list ¶

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

int_list_validator ¶

int_list_validator ( sep = ',' , message = None , code = 'invalid' , allow_negative = False ) [исходный код] ¶

Возвращает экземпляр RegexValidator , который гарантирует, что строка состоит из целых чисел, разделенных sep . Он допускает отрицательные целые числа, когда allow_negative равно True .

MaxValueValidator ¶

class MaxValueValidator ( limit_value , message = None ) [исходный код] ¶

Вызывает ValidationError с кодом 'max_value' , если value больше limit_value , который может быть вызываемым.

MinValueValidator ¶

class MinValueValidator ( limit_value , message = None ) [исходный код] ¶

Вызывает ValidationError с кодом 'min_value' , если value меньше limit_value , который может быть вызываемым.

MaxLengthValidator ¶

class MaxLengthValidator ( limit_value , message = None ) [исходный код] ¶

Вызывает ValidationError с кодом 'max_length' , если длина value больше limit_value , который может быть вызываемым.

MinLengthValidator ¶

class MinLengthValidator ( limit_value , message = None ) [исходный код] ¶

Вызывает ValidationError с кодом 'min_length' , если длина value меньше limit_value , который может быть вызываемым.

DecimalValidator ¶

class DecimalValidator ( max_digits , decimal_places ) [исходный код] ¶

Вызывает ValidationError со следующими кодами:

  • 'max_digits' , если количество цифр больше max_digits .
  • 'max_decimal_places' если количество десятичных знаков больше decimal_places .
  • 'max_whole_digits' , если количество целых цифр больше, чем разница между max_digits и decimal_places .

FileExtensionValidator ¶

class FileExtensionValidator ( allowed_extensions , message , code ) [исходный код] ¶

Вызывает ошибку ValidationError с кодом 'invalid_extension' , если расширение value.name ( value является File ) не найдено в allowed_extensions . Расширение сравнивается регистронезависимо с allowed_extensions .

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

validate_image_file_extension ¶

Использует Pillow, чтобы убедиться, что value.name ( value является File ) имеет a valid image extension.

ProhibitNullCharactersValidator ¶

class ProhibitNullCharactersValidator ( message = None , code = None ) [исходный код] ¶

Вызывает ошибку ValidationError , если str(value) содержит один или более символов нуля ( '\x00' ).

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "null_characters_not_allowed" .

У меня есть приложение, которое позволяет людям загружать файлы, представленные как UploadedFiles . Однако я хочу убедиться, что пользователи загружают только файлы xml. Я знаю, что могу сделать это с помощью magic , но я не знаю, где поставить эту проверку - я не могу поместить ее в функцию clean , поскольку файл еще не загружен, когда clean работает, насколько я могу судить.

Вот модель UploadedFile :

Для потомков: решение состоит в том, чтобы использовать метод read и передать его magic.from_buffer .

Проверка файлов - обычная проблема, поэтому я хотел бы использовать валидатор:

Затем вы можете использовать FileValidator в своем models.FileField или forms.FileField следующим образом:

Из django 1.11 вы также можете использовать FileExtensionValidator.

Обратите внимание, что это необходимо использовать в FileField и не будет работать с CharField (например), поскольку валидатор проверяет значение value.name.

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

Если вам нужно учитывать безопасность системы при загрузке

Убедитесь, что загруженный файл имеет правильное расширение

Убедитесь, что тип mimetype соответствует расширению файла.

Если вас беспокоит загрузка пользователем файлов эксплойтов (для атаки на ваш сайт)

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

Убедитесь, что вы используете заголовок Content-Disposition при загрузке

Ниже приведен пример очистки загруженных изображений:

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

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

Например, вот валидатор, который допускает только четные числа:

Вы можете добавить это к полю модели через аргумент поля validators :

Поскольку значения преобразуются в Python до запуска валидаторов, вы можете использовать один и тот же валидатор даже с формами:

Вы также можете использовать класс с методом __call__() для более сложных или настраиваемых валидаторов. Например, RegexValidator использует эту технику. Если в опции поля модели validators используется валидатор на основе класса, необходимо убедиться, что он serializable by the migration framework , добавив методы deconstruct() и __eq__() .

Как работают валидаторы¶

Смотрите form validation для получения дополнительной информации о том, как запускаются валидаторы в формах, и Validating objects для того, как они запускаются в моделях. Обратите внимание, что валидаторы не будут запускаться автоматически при сохранении модели, но если вы используете ModelForm , он будет запускать ваши валидаторы на всех полях, включенных в вашу форму. См. ModelForm documentation для получения информации о том, как валидация модели взаимодействует с формами.

Встроенные валидаторы¶

Модуль django.core.validators содержит коллекцию вызываемых валидаторов для использования с полями моделей и форм. Они используются внутри модуля, но доступны и для использования с вашими собственными полями. Их можно использовать в дополнение или вместо пользовательских методов field.clean() .

RegexValidator ¶

  • regex – Если не None , переопределяет regex . Может быть строкой регулярного выражения или предварительно скомпилированным регулярным выражением.
  • message – Если не None , переопределяет message .
  • code – Если не None , переопределяет code .
  • inverse_match – Если не None , переопределяет inverse_match .
  • flags – Если не None , переопределяется flags . В этом случае regex должно быть строкой регулярного выражения, иначе возникает TypeError .

RegexValidator ищет в предоставленном value для заданного регулярного выражения с re.search() . По умолчанию выдает ValidationError с message и code , если совпадение не найдено. Его поведение можно изменить, установив inverse_match в True , в этом случае ValidationError будет вызвано, когда совпадение найдено.

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "invalid" .

Режим соответствия для regex . По умолчанию False .

regex flags используется при компиляции строки регулярного выражения regex . Если regex является предварительно скомпилированным регулярным выражением, а flags переопределяется, то поднимается TypeError . По умолчанию используется 0 .

EmailValidator ¶

  • message – Если не None , переопределяет message .
  • code – Если не None , переопределяет code .
  • allowlist – Если не None , переопределяет allowlist .

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "invalid" .

Не рекомендуется, начиная с версии 3.2: Параметр whitelist является устаревшим. Вместо него используйте allowlist . Недокументированный атрибут domain_whitelist является устаревшим. Вместо него используйте domain_allowlist .

URLValidator ¶

class URLValidator ( schemes = None , regex = None , message = None , code = None ) [исходный код] ¶

Подкласс RegexValidator , который гарантирует, что значение выглядит как URL, и выдает код ошибки 'invalid' , если это не так.

В дополнение к необязательным аргументам своего родительского класса RegexValidator , URLValidator принимает дополнительный необязательный атрибут:

validate_email ¶

Экземпляр EmailValidator без каких-либо настроек.

validate_slug ¶

Экземпляр RegexValidator , который гарантирует, что значение состоит только из букв, цифр, подчеркивания или дефиса.

validate_unicode_slug ¶

Экземпляр RegexValidator , который гарантирует, что значение состоит только из букв Юникода, цифр, подчеркиваний или дефисов.

validate_ipv4_address ¶

Экземпляр RegexValidator , который гарантирует, что значение выглядит как IPv4-адрес.

validate_ipv6_address ¶

Использует django.utils.ipv6 для проверки достоверности IPv6-адреса.

validate_ipv46_address ¶

Использует validate_ipv4_address и validate_ipv6_address , чтобы убедиться, что значение является действительным IPv4 или IPv6 адресом.

validate_comma_separated_integer_list ¶

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

int_list_validator ¶

int_list_validator ( sep = ',' , message = None , code = 'invalid' , allow_negative = False ) [исходный код] ¶

Возвращает экземпляр RegexValidator , который гарантирует, что строка состоит из целых чисел, разделенных sep . Он допускает отрицательные целые числа, когда allow_negative равно True .

MaxValueValidator ¶

class MaxValueValidator ( limit_value , message = None ) [исходный код] ¶

Вызывает ValidationError с кодом 'max_value' , если value больше limit_value , который может быть вызываемым.

MinValueValidator ¶

class MinValueValidator ( limit_value , message = None ) [исходный код] ¶

Вызывает ValidationError с кодом 'min_value' , если value меньше limit_value , который может быть вызываемым.

MaxLengthValidator ¶

class MaxLengthValidator ( limit_value , message = None ) [исходный код] ¶

Вызывает ValidationError с кодом 'max_length' , если длина value больше limit_value , который может быть вызываемым.

MinLengthValidator ¶

class MinLengthValidator ( limit_value , message = None ) [исходный код] ¶

Вызывает ValidationError с кодом 'min_length' , если длина value меньше limit_value , который может быть вызываемым.

DecimalValidator ¶

class DecimalValidator ( max_digits , decimal_places ) [исходный код] ¶

Вызывает ValidationError со следующими кодами:

  • 'max_digits' , если количество цифр больше max_digits .
  • 'max_decimal_places' если количество десятичных знаков больше decimal_places .
  • 'max_whole_digits' , если количество целых цифр больше, чем разница между max_digits и decimal_places .

FileExtensionValidator ¶

class FileExtensionValidator ( allowed_extensions , message , code ) [исходный код] ¶

Вызывает ошибку ValidationError с кодом 'invalid_extension' , если расширение value.name ( value является File ) не найдено в allowed_extensions . Расширение сравнивается регистронезависимо с allowed_extensions .

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

validate_image_file_extension ¶

Использует Pillow, чтобы убедиться, что value.name ( value является File ) имеет a valid image extension.

ProhibitNullCharactersValidator ¶

class ProhibitNullCharactersValidator ( message = None , code = None ) [исходный код] ¶

Вызывает ошибку ValidationError , если str(value) содержит один или более символов нуля ( '\x00' ).

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "null_characters_not_allowed" .

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