.. .. META INFORMATION OF TRANSLATION .. .. $TranslationStatus: Done, waiting for revision $ .. $OriginalRevision: 11348 $ .. $TranslationAuthors: Igor Sobreira $ .. .. INFO OF THIS FILE (DO NOT EDIT! UPDATED BY SUBVERSION) .. .. $HeadURL$ .. $LastChangedRevision$ .. $LastChangedBy$ .. $LastChangedDate$ .. .. _howto-custom-file-storage: Escrevendo um sistema de armazenamento customizado ================================================== .. currentmodule:: django.core.files.storage 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étodo ``path()``. Seu sistema de armazenamento personalizado pode sobrescrever qualquer um dos métodos de armazenamento explicados em :ref:`ref-files-storage`, mas você **deve** implementar os seguintes métodos: * :meth:`Storage.delete` * :meth:`Storage.exists` * :meth:`Storage.listdir` * :meth:`Storage.size` * :meth:`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.