2012-09-30 6 views
8

Sto usando django-storages e sorl_thumbnail insieme e sto usando Amazon S3 per file statici e multimediali. Sto usando un secchio con 2 cartelle, 1 per statico e 1 per media.django-storages + sorl_thumbnail + S3 non funziona bene insieme (URL non corrispondenti)

Ecco la mia configurazione:

MEDIA_ROOT = '/media/' 
MEDIA_URL = 'https://s3.amazonaws.com/my-bucket/media/' 
STATIC_ROOT = '/static/' 
STATIC_URL = 'https://s3.amazonaws.com/my-bucket/static/' 
AWS_STORAGE_BUCKET_NAME = 'my-bucket' 
DEFAULT_FILE_STORAGE = 'my_lib.s3utils.MediaRootS3BotoStorage' 
STATICFILES_STORAGE = 'my_lib.s3utils.StaticRootS3BotoStorage' 

MediaRootS3BotoStorage e StaticRootS3BotoStorage sono definiti in questo modo:

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

Quando sto usando sorl_thumbnail, le miniature generate si trovano nella directory giusta: https://s3.amazonaws.com/my-bucket/media/cache ma quando sorl_thumbnail sta cercando di recuperare una miniatura già esistente, l'URL generato è: https://s3.amazonaws.com/my-bucket/cache, si noterà che la cartella media è stata omessa.

Avete qualche idea su come potrei risolverlo?

So che potrei semplicemente usare django-depositi e avere i miei file multimediali statici e tutto confuso nel mio secchio, ma questo è un po 'troppo sporca per i miei gusti :)

Grazie!

risposta

17

sono stato in grado di farlo funzionare con la definizione MediaRootS3BotoStorage e StaticRootS3BotoStorage come segue:

from storages.backends.s3boto import S3BotoStorage 
from django.conf import settings 

class StaticRootS3BotoStorage(S3BotoStorage): 
    """ 
    Storage for static files. 
    """ 

    def __init__(self, *args, **kwargs): 
     kwargs['location'] = 'static' 
     super(StaticRootS3BotoStorage, self).__init__(*args, **kwargs) 


class MediaRootS3BotoStorage(S3BotoStorage): 
    """ 
    Storage for uploaded media files. 
    """ 

    def __init__(self, *args, **kwargs): 
     kwargs['location'] = 'media' 
     super(MediaRootS3BotoStorage, self).__init__(*args, **kwargs) 

Questo collegamento può essere utile https://github.com/jamstooks/django-s3-folder-storage

+1

I metodi 'super()' su ciascuno dei metodi '__init __()' stanno chiamando le classi sbagliate. Essi dovrebbero essere: 'super (StaticRootS3BotoStorage, auto) .__ init __ (* args, ** kwargs)' e 'super (MediaRootS3BotoStorage, auto) .__ init __ (* args, ** kwargs)' – niceguydave

1

Ho avuto questo stesso problema esatto, ma ho trovato un modo intorno ad esso.

ho impostato la mia DEFAULT_FILE_STORAGE torna a storages.backends.s3boto.S3BotoStorage, in questo modo, quando sembrava per cache/ sarebbe non perdere, e ho potuto ancora caricare tutti i miei file da media/, e python manage.py collectstatic funziona ancora correttamente perché ho ancora quell'insieme come StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') .

Spero che questo ti aiuti, perché questo problema mi stava facendo impazzire.

+0

grazie per il tuo aiuto! Ma il risultato per me quando utilizzo queste impostazioni sono i file statici che vanno nella cartella/static/su S3 ma tutti i file caricati si trovano nella cartella root, non vanno in/media /. Qualche idea? –

+0

Ci scusiamo per la risposta in ritardo, ma assicurati che nei tuoi modelli stai usando 'UPLOAD_TO = 'media /''. Dovresti mettere i tuoi file caricati dove li vuoi. –

+0

Sì, ho intuito che stavate facendo, ma io preferirei no, altrimenti si rompe lo scopo di come funziona django :) Grazie comunque! –

0

scoperto che sorl-thumbnail sta tornando l'KV immagine memorizzata nella cache url usando STATIC_URL (sulla richiesta successiva dopo che la miniatura iniziale è stata creata). Appare MEDIA_URL non ha alcun effetto.

Non è la soluzione migliore. Aggiunta una regola di routing S3.

<RoutingRules> 
    <RoutingRule> 
    <Condition> 
     <KeyPrefixEquals>cache/</KeyPrefixEquals> 
    </Condition> 
    <Redirect> 
     <ReplaceKeyPrefixWith>media/cache/</ReplaceKeyPrefixWith> 
    </Redirect> 
    </RoutingRule> 
</RoutingRules> 
8

Ho avuto lo stesso problema e la soluzione di Salma Hamed è risultata essere quella giusta per me.

Prima abbiamo avuto

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

che ha portato i valori sbagliati 'deposito' nella nostra tabella thumbnail_kvstore.Questa definizione lambda non crea una nuova classe e quindi digita (StaticRootS3BotoStorage()) restituisce "storages.backends.s3boto.S3BotoStorage", che viene scritto nella tabella. Poiché questi valori di "archiviazione" vengono utilizzati per creare un'istanza successiva dello spazio di archiviazione al fine di ottenere gli URL dell'immagine durante la visualizzazione, ciò ha comportato l'utilizzo di S3BotoStorage(). Quindi l'argomento "posizione" è stato perso.

La soluzione di Salma Hamed che definisce questi archivi personalizzati come le classi risolve questo problema.

Grazie per quello!

+0

Ti ricordi dove hai imparato ad usare la precedente soluzione di 'lambda: S3BotoStorage (location = 'static')'? Vorrei pubblicare un commento o correggerlo. – Flimm

Problemi correlati