Escrevendo um sistema de armazenamento customizado

Se você precisar fornecer sistema de armazenamento customizado - um exemplo comum é armazenar arquivos em algum sistema remoto - você pode fazê-lo, definindo uma classe de armazenamento customizada. Você precisará seguir esses passos:

  1. Seu mecanismo de amazenamento customizado deve ser uma subclasse de django.core.files.storage.Storage:

    from django.core.files.storage import Storage
    
    class MyStorage(Storage):
        ...
    
  2. O Django deve ser capaz de instanciar o seu sistema de armazenamento sem quaisquer argumentos. Isto significa que qualquer definição deve ser obtida a partir de 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. Sua classe de armazenamento deve implementar os métodos _open() e _save(), juntamente com quaisquer outros métodos adequados para sua classe. Veja abaixo mais informações sobre esses métodos. Além disso, se a sua classe forcener um sistema de armazenamento local, ela deve sobrescrever o método path().

Seu sistema de armazenamento personalizado pode sobrescrever qualquer um dos métodos de armazenamento explicados em API de armazenamento de arquivos., mas você deve implementar os seguintes métodos:

  • Storage.delete()
  • Storage.exists()
  • Storage.listdir()
  • Storage.size()
  • Storage.url()

Geralmente você também vai querer usar ganchos concebidos especificamente para objetos de armazenamento personalizados. São eles:

_open(name, mode='rb')

Obrigatório.

Chamado por Storage.open(), esse é o verdadeiro mecanismo que a classe de armazenamento usa para abrir o arquivo. Ele deve retornar um objeto File, embora na maioria dos casos, você preferirá retornar alguma subclasse que implemente a lógica específica do backend do sistema de armazenamento.

_save(name, content)

Chamado por Storage.save(). O name já terá passado por get_valid_name() e get_available_name(), e o content será um objeto File em si.

Deve retornar o nome real do arquivo salvo (normalmente o name recebido, mas se o storage precisa mudar o nome do arquivo o novo nome deve ser retornado).

get_valid_name(name)

Retorna um nome de arquivo adequado para uso com o sistema de armazenamento subjacente. O argumento name passado para este método é o nome de arquivo original enviado para o servidor, depois de ter removido qualquer informação de caminho. Sobrescreva este método para customizar como caracteres fora do padrão são convertidos para nomes de arquivos válidos.

O código fornecido em Storage retém apenas caracteres alfanuméricos, pontos e sublinhas do arquivo original, removendo todo o resto.

get_available_name(name)

Retorna um nome de arquivo que está disponível no mecanismo de armazenamento, possivelmente levando em conta o nome de arquivo fornecido. O argumento name passado para este método já terá sido validado para um nome de arquivo válido para o sistema de armazenamento, de acordo com o método get_valid_name() descrito acima.

O código fornecido em Storage simplesmente adiciona sublinhas ao nome do arquivo até encontrar um que esteja disponível no diretório de destino.