جانغو-ستوراجيس + سورل_ثومبنايل + س 3 لا تعمل بشكل جيد معا (عدم تطابق عناوين المواقع)
-
11-12-2019 - |
سؤال
أنا أستخدم مخازن جانغو و سورلثومبنايل معا وأنا أستخدم أمازون إس 3 لملفات ثابتة ووسائط.أنا باستخدام دلو واحد مع 2 المجلدات ، 1 ل ثابت و 1 لوسائل الإعلام.
هنا هو التكوين الخاص بي:
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
و StaticRootS3BotoStorage
يتم تعريفها على النحو التالي:
StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media')
عندما أستخدم سورلثومبنايل ، توجد الصور المصغرة التي تم إنشاؤها في الدليل الصحيح: https://s3.amazonaws.com/my-bucket/media/cache
ولكن عندما سورلثومبنايل يحاول استرداد صورة مصغرة موجودة بالفعل ، ورل ولدت هو: https://s3.amazonaws.com/my-bucket/cache
, ، ستلاحظ أن media
تم حذف المجلد.
هل لديك أي فكرة كيف يمكنني إصلاح ذلك?
وأنا أعلم أنني يمكن أن مجرد استخدام جانغو-ستوراجيس ولها بلدي ثابت وملفات الوسائط كلها مختلطة في دلو بلدي ، ولكن هذا قليلا قذرة جدا لذوقي:)
شكرا لك!
المحلول
وكنت قادرا على انجاحه من خلال تحديد MediaRootS3BotoStorage و StaticRootS3BotoStorage على النحو التالي:
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)
هذا الرابط يمكن أن يكون مفيدا https://github.com/jamstooks/django-s3-folder-storage
نصائح أخرى
كان لدي نفس المشكلة وتحليل سلمى حامد تحولت إلى اليمين بالنسبة لي.
قبل أن يكون لدينا giveacodicetagpre.
مما أدى إلى قيم "التخزين" خاطئة في طاولة Thumbnail_kvstore.لا يخلق تعريف Lambda هذا فئة جديدة وبالتالي اكتب (staticroots3botostorage ()) إرجاع "storages.back.s3boto.s3botostorage"، والذي يتم كتابته في الجدول.نظرا لأن قيم "التخزين" هذه تستخدم لإصدار إصدار في وقت لاحق التخزين للحصول على عناوين URL عند العرض عند العرض، نتجت ذلك S3Botostorage () المراد استخدامه لهذا الغرض.لذلك فقدت حجة "الموقع".
الحل من سلمى حامد يحدد هذه المخازن المخصصة كصفات تصحيح هذا.
شكرا لذلك!
هل حاولت إعداد Thumbnail_Prefix إلى الوسائط / ذاكرة التخزين المؤقت /؟
http://sorl-thumbnail.readthedocs.ORG / EN / LATH / SETCHIOND.HTML # Thumbnail-Prefix
كان لي نفس المشكلة بالضبط ولكن أنا أحسب وسيلة من حوله.
أنا وضعت بلدي DEFAULT_FILE_STORAGE
العودة إلى storages.backends.s3boto.S3BotoStorage
, ، بهذه الطريقة ، عندما بحثت عن cache/
انها لن تفوت ، وأنا لا تزال قادرة على تحميل جميع الملفات الخاصة بي ل media/
, ، و python manage.py collectstatic
لا يزال يعمل بشكل صحيح لأنه لا يزال لدي هذا النحو StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
.
آمل أن يساعدك هذا ، لأن هذه المشكلة كانت تدفعني للجنون.
وجدت أن sorl-thumbnail
هو إرجاع المخزن المؤقت KV
صورة url
باستخدام STATIC_URL
(في الطلب التالي بعد إنشاء الصورة المصغرة الأولية).يظهر MEDIA_URL
ليس له تأثير.
ليس الحل الأفضل.وأضاف أ S3
قاعدة التوجيه.
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>cache/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith>media/cache/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
</RoutingRules>