2016-02-15 14 views
8

Ho fatto delle ricerche e ho trovato articoli che spiegano come utilizzare il busting della cache di Django (1.8), ma non spiegano la mia situazione.Django 1.8 Cache busting + Amazon S3

Sto usando S3 (e funziona) con la seguente impostazione nel settings.py:

STATICFILES_STORAGE= 'pms.s3utils.StaticRootS3BotoStorage' 

Per poter utilizzare il busting della cache del docs dire che devo impostare: STATICFILES_STORAGE='django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

I don Non so quale impostazione utilizzare per utilizzare sia S3 che il busting della cache.

Grazie!

risposta

9

Così ho finalmente trovato una soluzione alternativa.

Al fine di essere in grado di caricare i miei file di 2 cartelle diverse (statici e upload) nel mio secchio S3 ho questo nel mio settings.py di file:

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

E questo nel file myapp.s3utils.py:

from storages.backends.s3boto import S3BotoStorage 

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

Ma non potevo usare il busting della cache di Django. La soluzione era quello di cambiare il mio file myapp.s3utils.py a:

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') 

Fondamentalmente si aggiunge la ManiFestfilesMixin, che consente di utilizzare il busting della cache.

Come nota a margine, è possibile vedere che sto utilizzando solo il busting della cache per i file statici, ma non per i file di upload. Questo è il motivo per cui lo MediaRootS3BotoStorage chiama la classe S3BotoStorage anziché lo CustomS3Storage. Lo faccio in questo modo perché i file di upload non sono memorizzati nel mio server (i file statici sono), sono memorizzati direttamente nel bucket S3, quindi quando ho eseguito il collectstatic non sono sul mio server, quindi non Non è necessario aggiungere l'hash ai nomi.

+1

Wow, questo salva la mia giornata !! Ho avuto a che fare con questo per un paio d'ore senza alcun successo. Non capisco perché questa risposta non abbia voti più positivi. Questa semplice modifica su s3utils.py funziona come un fascino per me :) Grazie amico !!! – rdiaz82

+0

Dove viene salvato 'staticfiles.json' in questo caso, in S3 o nel filesystem locale? Ed è letto con ogni richiesta? – Flimm

+0

Per rispondere alla mia domanda, sembra che 'staticfiles.json' venga memorizzato in S3, visibile pubblicamente, e non venga letto con ogni richiesta. – Flimm