Написание собственной системы хранения

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

  1. Ваша индивидуальная система хранения должна быть подклассом django.core.files.storage.Storage :

    from django.core.files.storage import Storage
    
    class MyStorage(Storage):
        ...
    
  2. Django должен иметь возможность создать экземпляр вашей системы хранения без параметров. Это означает, что любая корректировка должна исходить из django.conf.settings :

    from django.conf import settings
    from django.core.files.storage import Storage
    
    class MyStorage(Storage):
        def __init__(self, option=None):
            if not option:
                option = settings.CUSTOM_STORAGE_OPTIONS
            ...
    
  3. Ваш класс хранилища должен реализовывать методы _open() и _save() , в дополнение к любому другому подходящему методу для вашего класса хранилища. См. Ниже более подробную информацию об этих методах.

    Кроме того, если ваш класс предоставляет локальное хранилище файлов, он должен переопределить метод path() .

  4. Ваш класс хранилища должен быть деконструируемым, прежде чем его можно будет сериализовать при ссылке в поле при миграции. Поскольку параметры поля сами по себе сериализуемы , вы можете использовать django.utils.deconstruct.deconstructible для этого декоратор класса (это то, что использует Django FileSystemStorage ).

По умолчанию следующие методы генерируются NotImplementedError и обычно должны быть перегружены:

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

Например, если перечисление содержимого некоторых механизмов хранения является дорогостоящим, вполне возможно отказаться от реализации Storage.listdir() .

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

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

Обычно желательно реализовать методы, специально разработанные для пользовательских объектов хранения. Это:

_open( имя , режим = 'rb' )

Обязательно .

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

_save( имя , содержание )

Вызывается Storage.save() . Параметр name уже будет передан через get_valid_name() и get_available_name() и content будет объектом типа File .

Он должен возвращать фактическое имя сохраненного файла (обычно параметр name , но если хранилище необходимо изменить имя файла, должно быть возвращено новое имя).

get_valid_name( имя )

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

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

get_alternative_name( корневой_файл , файл_внешний )
Новое в Django 3.0.

Возвращает другое имя файла , основанное на file_root и параметрах file_ext . По умолчанию в конце имени файла перед расширением добавляется символ подчеркивания, за которым следует случайная строка из 7 буквенно-цифровых символов.

get_available_name( name , max_length = None )

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

max_length Если указана эта опция, длина имени файла не будет больше . Если уникальное имя файла недоступно, создается исключение SuspiciousFileOperation .

Если файл с name уже существует, get_alternative_name() вызывается для получения другого имени.

Copyright ©2020 All rights reserved