Ich konfiguriere ein Django-Projekt, das das Server-Dateisystem zum Speichern der statischen Dateien der Apps ( STATIC_ROOT
) und der vom Benutzer hochgeladenen Dateien ( MEDIA_ROOT
) verwendet.
Ich muss jetzt all diese Inhalte auf Amazon S3 hosten, also habe ich einen Bucket dafür erstellt. Mit django-storages
dem boto
Speicher-Backend konnte ich gesammelte Statiken in den S3-Bucket hochladen:
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'
Dann habe ich ein Problem: Die MEDIA_ROOT
und STATIC_ROOT
werden nicht im Bucket verwendet, sodass der Bucket-Stamm sowohl die statischen Dateien als auch die vom Benutzer hochgeladenen Pfade enthält.
Also könnte ich einstellen:
S3_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL + STATIC_ROOT
MEDIA_URL = 'S3_URL + MEDIA_ROOT
Und verwenden Sie diese Einstellungen in den Vorlagen, aber es gibt keine Unterscheidung zwischen statischen / Mediendateien beim Speichern in S3 mit django-storages
.
Wie kann das gemacht werden?
Vielen Dank!
quelle
AWS_STORAGE_BUCKET_NAME
) angegeben wird, wird diese verwendet, wenn eine Instanz der in angegebenen KlasseSTATICFILES_STORAGE
instanziiert wird.Antworten:
Ich denke, das Folgende sollte funktionieren und einfacher sein als Mandx 'Methode, obwohl sie sehr ähnlich ist:
Erstellen Sie eine
s3utils.py
Datei:Dann in Ihrem
settings.py
:Ein anderes, aber verwandtes Beispiel (das ich tatsächlich getestet habe) ist in den beiden
example_
Dateien hier zu sehen .quelle
Ich verwende diesen Code derzeit in einem separaten
s3utils
Modul:Dann in meinem Einstellungsmodul:
Ich musste die
_normalize_name()
private Methode neu definieren , um eine "feste" Version dersafe_join()
Funktion zu verwenden, da der ursprüngliche Code mirSuspiciousOperation
Ausnahmen für legale Pfade gibt.Ich poste dies zur Prüfung. Wenn jemand eine bessere Antwort geben oder diese verbessern kann, ist dies sehr willkommen.
quelle
Und Renn:
python manage.py collectstatic
quelle
storages.py
anstattcustom_storages.py
Sie verwenden möchtenfrom __future__ import absolute_import
Ich denke, die Antwort ist ziemlich einfach und erfolgt standardmäßig. Dies funktioniert für mich an AWS Elastic Beanstalk mit Django 1.6.5 und Boto 2.28.0:
Die AWS-Schlüssel werden aus der Containerkonfigurationsdatei übergeben und ich habe keine
STATIC_ROOT
oder überhaupt keineSTATIC_URL
. Auch keine Notwendigkeit für dies3utils.py
Datei. Diese Details werden vom Speichersystem automatisch verarbeitet. Der Trick dabei ist, dass ich diesen unbekannten Pfad in meinen Vorlagen korrekt und dynamisch referenzieren musste. Beispielsweise:Auf diese Weise adressiere ich mein Favicon, das lokal (vor der Bereitstellung) in lebt
~/Projects/my_app/project/my_app/static/img/favicon.ico
.Natürlich habe ich eine separate
local_settings.py
Datei für den lokalen Zugriff auf dieses Material in der Entwicklungsumgebung und sie hat STATIC- und MEDIA-Einstellungen. Ich musste viel experimentieren und lesen, um diese Lösung zu finden, und sie funktioniert konsistent ohne Fehler.Ich verstehe, dass Sie die statische Trennung und die Root-Trennung benötigen, und da Sie nur einen Bucket bereitstellen können, möchte ich darauf hinweisen, dass diese Methode alle Ordner in meiner lokalen Umgebung unter
~/Projects/my_app/project/my_app/static/
und einen Ordner im Bucket-Root erstellt (dh: S3bucket / img / wie im obigen Beispiel). Sie erhalten also eine Trennung von Dateien. Zum Beispiel könnten Sie einenmedia
Ordner imstatic
Ordner haben und über folgende Vorlagen darauf zugreifen:Ich hoffe das hilft. Ich bin hierher gekommen, um nach der Antwort zu suchen, und habe mich etwas mehr Mühe gegeben, eine einfachere Lösung zu finden, als das Speichersystem zu erweitern. Stattdessen las ich die Dokumentation über die beabsichtigte Verwendung von Boto und stellte fest, dass vieles, was ich brauchte, standardmäßig integriert war. Prost!
quelle
Wenn Sie Unterordner bereits vor Medien- oder statischen Trennungen haben möchten, können Sie AWS_LOCATION zusätzlich zu bradenm answer verwenden. Referenz: https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#usage
quelle