Estou configurando um projeto Django que estava usando o sistema de arquivos do servidor para armazenar os arquivos estáticos dos aplicativos (STATIC_ROOT
) e os arquivos carregados pelo usuário ( MEDIA_ROOT
).
Eu preciso agora hospedar todo esse conteúdo no S3 da Amazon, então criei um bucket para isso. Usando django-storages
o boto
back-end de armazenamento, consegui fazer upload das estatísticas coletadas para o intervalo S3:
MEDIA_ROOT = '/media/'
STATIC_ROOT = '/static/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'KEY_ID...'
AWS_SECRET_ACCESS_KEY = 'ACCESS_KEY...'
AWS_STORAGE_BUCKET_NAME = 'bucket-name'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Então, eu tenho um problema: o MEDIA_ROOT
e STATIC_ROOT
não são usados dentro do intervalo, portanto, a raiz do intervalo contém os arquivos estáticos e os caminhos carregados pelo usuário.
Então eu poderia definir:
S3_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL + STATIC_ROOT
MEDIA_URL = 'S3_URL + MEDIA_ROOT
E use essas configurações nos modelos, mas não há distinção de arquivos estáticos / de mídia ao armazenar no S3 com django-storages
.
Como isso pode ser feito?
Obrigado!
fonte
AWS_STORAGE_BUCKET_NAME
), e é aquela usada quando uma instância da classe especificada emSTATICFILES_STORAGE
é instanciada.Respostas:
Acho que o seguinte deve funcionar e ser mais simples do que o método de Mandx, embora seja muito semelhante:
Crie um
s3utils.py
arquivo:Então em seu
settings.py
:Um exemplo diferente, mas relacionado (que eu realmente testei) pode ser visto nos dois
example_
arquivos aqui .fonte
Atualmente, estou usando este código em um
s3utils
módulo separado :Então, no meu módulo de configurações:
Eu tive que redefinir o
_normalize_name()
método privado para usar uma versão "fixa" dasafe_join()
função, já que o código original está me dandoSuspiciousOperation
exceções para caminhos legais.Estou postando isso para consideração, se alguém puder dar uma resposta melhor ou melhorar esta, será muito bem-vindo.
fonte
E corra:
python manage.py collectstatic
fonte
storages.py
vez decustom_storages.py
Você deseja usarfrom __future__ import absolute_import
Acho que a resposta é muito simples e feita por padrão. Isso está funcionando para mim no AWS Elastic Beanstalk com Django 1.6.5 e Boto 2.28.0:
As chaves da AWS são passadas do arquivo de configuração do contêiner e eu não as tenho
STATIC_ROOT
ou asSTATIC_URL
defini. Além disso, não há necessidade des3utils.py
arquivo. Esses detalhes são tratados pelo sistema de armazenamento automaticamente. O truque aqui é que eu precisava fazer referência a esse caminho desconhecido em meus modelos de maneira correta e dinâmica. Por exemplo:É assim que me dirijo ao meu favicon que reside localmente (pré-implantação) em
~/Projects/my_app/project/my_app/static/img/favicon.ico
.Claro que tenho um
local_settings.py
arquivo separado para acessar essas coisas localmente no ambiente dev e ele tem configurações ESTÁTICAS e MÍDIA. Tive de experimentar e ler muito para encontrar esta solução e funciona de forma consistente e sem erros.Eu entendo que você precisa da separação estática e raiz e considerando que você só pode fornecer um intervalo, gostaria de salientar que esse método pega todas as pastas em meu ambiente local
~/Projects/my_app/project/my_app/static/
e cria uma pasta na raiz do intervalo (ou seja: S3bucket / img / como no exemplo acima). Então você consegue separação de arquivos. Por exemplo, você poderia ter ummedia
pasta nastatic
pasta e acessá-la por meio de modelos com isto:Eu espero que isso ajude. Vim aqui em busca de uma resposta e me esforcei um pouco mais para encontrar uma solução mais simples do que estender o sistema de armazenamento. Em vez disso, li a documentação sobre o uso pretendido do Boto e descobri que muito do que eu precisava estava embutido por padrão. Felicidades!
fonte
Se você quiser ter subpastas antes mesmo de mídia ou separações estáticas, você pode usar AWS_LOCATION no topo da resposta bradenm. Referência: https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#usage
fonte