2012-09-30 10 views
8

Ich verwende django-storages und sorl_thumbnail zusammen und verwende Amazon S3 für statische und Mediendateien. Ich benutze einen Eimer mit 2 Ordnern, 1 für statische und 1 für Medien.django-storage + sorl_thumbnail + S3 funktioniert nicht gut zusammen (URLs stimmen nicht überein)

Hier ist meine config:

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 und StaticRootS3BotoStorage wie folgt definiert sind:

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

Wenn ich sorl_thumbnail verwende, die generierten Thumbnails im richtigen Verzeichnis befinden: https://s3.amazonaws.com/my-bucket/media/cache aber wenn sorl_thumbnail versucht, ein bereits vorhandenes Thumbnail abzurufen. Die generierte URL lautet: https://s3.amazonaws.com/my-bucket/cache. Sie werden feststellen, dass der Ordner media nicht angegeben ist.

Haben Sie eine Idee, wie ich das beheben könnte?

Ich weiß, dass ich nur django-Speicher nutzen könnte und habe meine statischen und Mediendateien alle in meinem Eimer gemischt, aber das ist ein bisschen zu schmutzig für meinen Geschmack :)

Thank you!

Antwort

17

konnte ich es durch die Definition MediaRootS3BotoStorage und StaticRootS3BotoStorage wie folgt funktioniert:

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) 

Dieser Link ist hilfreich https://github.com/jamstooks/django-s3-folder-storage

kann
+1

Die Methoden 'super()' für jede der obigen '__init __()' Methoden rufen die falschen Klassen auf. sie sein sollten: 'Super (StaticRootS3BotoStorage, Selbst-) .__ init __ (* args, ** kwargs)' und 'Super (MediaRootS3BotoStorage, Selbst-) .__ init __ (* args, ** kwargs)' – niceguydave

1

Ich hatte das gleiche genaue Problem aber ich dachte, um es einen Ausweg.

ich mein DEFAULT_FILE_STORAGE zurück zu storages.backends.s3boto.S3BotoStorage, auf diese Weise, wenn es für cache/ sah würde es nicht verpassen, und ich konnte immer noch alle meine Dateien auf media/ hochladen und python manage.py collectstatic funktioniert immer noch richtig, weil ich immer noch diesen Satz als StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') haben .

Hoffe, das hilft Ihnen, weil dieses Problem mich verrückt machte.

+0

danke für deine Hilfe! Aber das Ergebnis für mich, wenn ich diese Einstellungen verwende, sind die statischen Dateien, die im/static/-Ordner von S3 liegen, aber alle hochgeladenen Dateien befinden sich im Stammordner, sie gehen nicht in/media /. Irgendeine Idee? –

+0

Entschuldigung für die späte Antwort, aber stellen Sie sicher, dass Sie in Ihren Modellen 'UPLOAD_TO = 'media /'' verwenden. Das sollte deine hochgeladenen Dateien dorthin bringen, wo du sie haben willst. –

+0

Ja, ich vermutete, dass du das gemacht hast, aber ich würde es lieber nicht, sonst bricht es einfach den Zweck, wie Django funktioniert :) Danke trotzdem! –

0

gefunden, dass sorl-thumbnail kehrt die im Cache gespeicherte KV Bild url Verwendung von STATIC_URL (bei der nächsten Anfrage nach dem Erstellen der ersten Miniaturansicht). Erscheint MEDIA_URL hat keinen Einfluss.

Nicht die beste Lösung. Es wurde eine Routing-Regel S3 hinzugefügt.

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

Ich hatte das gleiche Problem und die Lösung von Salma Hamed erwies sich als die richtige für mich.

Bevor wir hatten

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

, die in den falschen 'Lagerung' Werte in unserer thumbnail_kvstore Tabelle geführt.Diese Lambda-Definition erstellt keine neue Klasse und daher gibt type (StaticRootS3BotoStorage()) 'storages.backends.s3boto.S3BotoStorage' zurück, die in die Tabelle geschrieben wird. Da diese "Speicher" -Werte verwendet werden, um später den Speicher zu instanziieren, um die Bild-URLs beim Anzeigen zu erhalten, führte dies dazu, dass S3BotoStorage() dafür verwendet wurde. Das Argument 'Standort' wurde also verloren.

Die Lösung von Salma Hamed, die diese benutzerdefinierten Speicher als Klassen definiert, behebt dies.

Danke dafür!

+0

Erinnerst du dich, wo du gelernt hast, die vorherige Lösung von 'lambda: S3BotoStorage (location = 'static')' 'zu verwenden? Ich würde gerne einen Kommentar posten oder korrigieren. – Flimm