2016-02-15 6 views
8

Ich habe einige Nachforschungen angestellt, und ich habe Artikel gefunden, die erklären, wie man Djangos (1.8) Cache-Busting benutzt, aber sie erklären meine Situation nicht.Django 1.8 Cache-Busting + Amazon S3

I S3 bin mit (und es funktioniert) mit folgenden Einstellung in settings.py:

STATICFILES_STORAGE= 'pms.s3utils.StaticRootS3BotoStorage' 

Um Cache zu verwenden Zerschlagung der docs sagt ich gesetzt haben: STATICFILES_STORAGE='django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

I don Weiß nicht, welche Einstellung verwendet werden soll, um sowohl S3 als auch Cache-Busting zu verwenden.

Danke!

Antwort

9

Also habe ich endlich einen Workaround gefunden.

Um meine Dateien auf 2 verschiedenen Ordnern (statisch und Uploads) in der Lage sein in meinem S3 Eimer dies habe ich in meiner settings.py Datei hochladen:

STATICFILES_STORAGE = 'myapp.s3utils.StaticRootS3BotoStorage' 
DEFAULT_FILE_STORAGE = 'myapp.s3utils.MediaRootS3BotoStorage' 

Und dies in der myapp.s3utils.py Datei:

from storages.backends.s3boto import S3BotoStorage 

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') 
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='uploads') 

Aber ich konnte Djangos Cache-Busting nicht benutzen. Die Lösung wurde auf meine myapp.s3utils.py Datei ändern:

from storages.backends.s3boto import S3BotoStorage 

from django.contrib.staticfiles.storage import ManifestFilesMixin 

class CustomS3Storage(ManifestFilesMixin, S3BotoStorage): 
    pass 

StaticRootS3BotoStorage = lambda: CustomS3Storage(location='static') 
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='uploads') 

Im Grunde ist es fügt die ManiFestfilesMixin, die Sie Cache-Busting verwenden können.

Als eine Randnotiz können Sie sehen, dass ich nur Cache-Busting für die statischen Dateien, aber nicht für die Upload-Dateien verwenden. Deshalb ruft die MediaRootS3BotoStorage die S3BotoStorage Klasse anstelle der CustomS3Storage. Ich mache es so, weil die Upload-Dateien nicht in meinem Server gespeichert sind (die statischen Dateien sind), sie sind direkt in der S3-Bucket gespeichert, also wenn ich die Collectstatic lief sie nicht auf meinem Server, also ich don Ich muss den Namen den Hash hinzufügen.

+1

Wow, das spart meinen Tag !! Ich habe damit für ein paar Stunden ohne Erfolg gehandelt. Ich verstehe nicht, warum diese Antwort nicht mehr positive Stimmen hat. Diese einfache Änderung an der s3utils.py funktioniert wie ein Charme für mich :) Danke Kumpel !!! – rdiaz82

+0

Wo wird 'staticfiles.json' in diesem Fall gespeichert, in S3 oder im lokalen Dateisystem? Und wird es bei jeder Anfrage gelesen? – Flimm

+0

Um meine Frage zu beantworten, scheint 'staticfiles.json' in S3 öffentlich sichtbar zu sein und wird nicht bei jeder Anfrage gelesen. – Flimm