Je configure un projet Django qui utilisait le système de fichiers du serveur pour stocker les fichiers statiques des applications ( STATIC_ROOT
) et les fichiers téléchargés par l'utilisateur ( MEDIA_ROOT
).
Je dois maintenant héberger tout ce contenu sur S3 d'Amazon, j'ai donc créé un compartiment pour cela. En utilisant django-storages
le boto
backend de stockage, j'ai réussi à télécharger les statiques collectées dans le compartiment 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'
Ensuite, j'ai eu un problème: les MEDIA_ROOT
et STATIC_ROOT
ne sont pas utilisés dans le seau, donc la racine du seau contient à la fois les fichiers statiques et les chemins téléchargés par l'utilisateur.
Alors je pourrais définir:
S3_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL + STATIC_ROOT
MEDIA_URL = 'S3_URL + MEDIA_ROOT
Et utilisez ces paramètres dans les modèles, mais il n'y a pas de distinction entre les fichiers statiques / multimédias lors du stockage dans S3 avec django-storages
.
Comment cela peut-il être fait?
Merci!
la source
AWS_STORAGE_BUCKET_NAME
), et c'est celui utilisé lorsqu'une instance de la classe spécifiée dansSTATICFILES_STORAGE
est instanciée.Réponses:
Je pense que ce qui suit devrait fonctionner et être plus simple que la méthode de Mandx, bien qu'elle soit très similaire:
Créez un
s3utils.py
fichier:Puis dans votre
settings.py
:Un exemple différent mais lié (que j'ai réellement testé) peut être vu dans les deux
example_
fichiers ici .la source
J'utilise actuellement ce code dans un
s3utils
module séparé :Ensuite, dans mon module de paramétrage:
J'ai pu redéfinir la
_normalize_name()
méthode privée pour utiliser une version "fixe" de lasafe_join()
fonction, puisque le code d'origine me donne desSuspiciousOperation
exceptions pour les chemins légaux.Je publie ceci pour examen, si quelqu'un peut donner une meilleure réponse ou améliorer celle-ci, ce sera le bienvenu.
la source
Et courir:
python manage.py collectstatic
la source
storages.py
au lieu decustom_storages.py
Vous voudrez l'utiliserfrom __future__ import absolute_import
Je pense que la réponse est assez simple et faite par défaut. Cela fonctionne pour moi sur AWS Elastic Beanstalk avec Django 1.6.5 et Boto 2.28.0:
Les clés AWS sont transmises à partir du fichier de configuration du conteneur et je n'en ai aucune
STATIC_ROOT
ou je les aiSTATIC_URL
définies. En outre, pas besoin dus3utils.py
fichier. Ces détails sont traités automatiquement par le système de stockage. L'astuce ici est que j'avais besoin de référencer ce chemin inconnu dans mes modèles correctement et dynamiquement. Par exemple:C'est ainsi que j'adresse mon favicon qui vit localement (pré-déploiement) dans
~/Projects/my_app/project/my_app/static/img/favicon.ico
.Bien sûr, j'ai un
local_settings.py
fichier séparé pour accéder à ce contenu localement dans l'environnement de développement et il a des paramètres STATIC et MEDIA. J'ai dû faire beaucoup d'expérimentation et de lecture pour trouver cette solution et cela fonctionne de manière cohérente sans erreur.Je comprends que vous avez besoin de la séparation statique et racine et étant donné que vous ne pouvez fournir qu'un seul compartiment, je tiens à souligner que cette méthode prend tous les dossiers de mon environnement local
~/Projects/my_app/project/my_app/static/
et crée un dossier dans la racine du compartiment (par exemple: S3bucket / img / comme dans l'exemple ci-dessus). Vous obtenez donc une séparation des fichiers. Par exemple, vous pouvez avoir unmedia
dossier dans lestatic
dossier et y accéder via un modèle avec ceci:J'espère que ça aide. Je suis venu ici à la recherche de la réponse et j'ai poussé un peu plus dur pour trouver une solution plus simple que pour étendre le système de stockage. Au lieu de cela, j'ai lu la documentation sur l'utilisation prévue de Boto et j'ai trouvé qu'une grande partie de ce dont j'avais besoin était intégrée par défaut. À votre santé!
la source
Si vous souhaitez avoir des sous-dossiers avant même les séparations multimédias ou statiques, vous pouvez utiliser AWS_LOCATION en plus de la réponse bradenm. Référence: https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#usage
la source