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:
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): ...
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 ...
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étodopath()
.
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.