قم بإنشاء صورة مصغرة للصور ديناميكيًا (باستخدام Django)

StackOverflow https://stackoverflow.com/questions/2106507

  •  21-09-2019
  •  | 
  •  

سؤال

أرغب في إنشاء صورة مصغرة بناءً على المعلمات في عنوان URL. فمثلا، http://mysite.com/images/1234/120x45.jpg من شأنه أن يخلق 120x45 الصورة المصغرة لمعرف الصورة 1234.

الحل الواضح لهذا هو أن يكون لديك عرض Django الذي يلي:

  1. ابحث عن نسخة مخبأة مسبقًا من الصورة بهذا الحجم.
  2. قم بإنشاء صورة مصغرة إذا لم يتم تخزينها مؤقتًا (بعض المنطق للقفل بحيث تقوم عملية واحدة فقط بإنشاء الصورة المصغرة وانتظار عمليات أخرى).
  3. الأنابيب النتائج من خلال Django.

يجب أن "يعمل" ، لكنني قلق بشأن الأداء. لا أحب فكرة استخدام Django لتقديم محتوى ثابت. ما هي بعض الطرق الأخرى لإنجاز هذه المشكلة؟

هل كانت مفيدة؟

المحلول

ليس عليك استخدام Django لخدمة المحتوى الثابت مباشرة. ما عليك سوى الحصول على طلبات Route Route 404 الخاصة بمجلد الصور الخاص بك إلى عرض Django ، حيث يقوم بتقسيم اسم الملف وينشئ الصورة المصغرة المناسبة ، قبل إعادة توجيه عنوان URL الأصلي (الذي نأمل ألا يكون 404).

أما بالنسبة لاقتراح الإجابة الأخرى ، فأنا لست متأكدًا من أنه يفعل أي شيء للسماح لك ديناميكيا قم بإنشاء إبهام الصورة على أساس عنوان URL ، لكنني بالتأكيد أوصي باستخدامه لجميع الميزات التي لديها.

يحرر:

أما بالنسبة لهيكل عنوان URL الفعلي ، أشعر أنني أكثر نموذجيًا /images/filename-120x45.jpg سيسمح لك بتصفية 404 طلبًا بسهولة أكبر لا علاقة له بتوليد الصورة الديناميكية. قل ، على سبيل المثال ، أن هناك الكثير من 404 خطأ ل /images/original_size_image.jpg. لن ترغب في توجيه من يتم توجيههم إلى Django ، ويمكنك فقط مطابقة أسماء الملفات بهذا التنسيق مع Regex. نهاية التحرير

عليك أن تكون حذراً على الرغم من السماح لأي شخص على دراية بهذه الميزة البريد العشوائي لتطبيق Django الخاص بك. يمكن أن يقتلوه بعدد لا حصر له من حجم الصورة وتوليفات اسم الملف في أطراف أصابعهم. ستحتاج إلى معرفة كيفية وضع الحدود العليا على هذه الطلبات ، مثل إعادة توجيه مرة أخرى إلى 404 إذا كان أي من البعد أكبر من الأصل ، أو حتى معرفة كيفية الحد من طلبات أبعاد متعددة من نفس الصورة. ربما كان هذا ما كنت تحصل عليه عند ذكر "قفل".

جانبا ، أرى أنك وضعت علامة Apache ولكن أود حقًا أن أوصي بأن تخدم محتوى ثابتًا من خلال شيء مثل nginx. ربما يمكنك إلغاء النفقات العامة الإضافية لطلبات الصورة الديناميكية إذا كنت تستخدم خادم ملفات ثابتة لا يكتمل الهراء في تقديم الملفات الثابتة.

نصائح أخرى

يمكنك أيضًا المحاولة سورل, ، يتم استخدامه بواسطة Satchmo.

انظر هذا التطبيق لتوليد الإبهام.

تم تطويره في بيثون ، باستخدام خادم Tornadoweb.

https://github.com/globocom/thumbor

pip install thumbor

تطبيق رائع

بحثت عن هذه الإجابات وعلى الرغم من أنها تعمل ، إلا أنها كانت متطورة للغاية بالنسبة لي. إذا كنت تريد فقط طريقة سريعة وقذرة للحصول على صورة مصغرة ، فقد يكون استخدام مكتبة PIL بمثابة مكالمة جيدة ، فهذه هي الكود الخاص بي:

file, ext = os.path.splitext('image.jpg')
im = Image.open('/full/path/to/image.jpg')
im.thumbnail(size, Image.ANTIALIAS)
thumb_path = os.path.join('/full/path/to/thumb/dir/', file + ".thumb" + ".jpeg")
im.save(thumb_path)

قم بتنزيل مكتبة PIL هنا

هتاف ، يأمل أن يساعد هذا شخص ما.

يمكنك إلقاء نظرة خاطفة على وثائق Sorl-Thumbnail. أستخدمه في جميع مشاريعي تقريبًا مع تقديم محتوى ثابت مع Nginx من /media/ دير :)

تحقق من صفحة المناقشة هذه حول مساهمة الصورة المصغرة لـ Django:

https://code.djangoproject.com/wiki/thumbnails

لقد واجهت نفس المشكلة الدقيقة: في موقع عالي المرور ، فإن توليد عشرات الصور المصغرة في وقت الاستجابة غير ممكن ، كما هو الحال في توليد الصور المصغرة لجميع المحتوى السابق في الدفعة ، لذلك قمت بإنشاء تطبيق لذلك. تحقق من ذلك: https://github.com/hcarvalhoalves/django-rest-thumbnails

Thumbor هي بالفعل خدمة رائعة ، يمكنك استخدام Django-Thumbor على Django.

pip install django-thumbor

repo هنا:https://github.com/ricobl/django-thumbor

قد تحتاج فقط إلى تغيير حجم الصورة المعروضة ، بناءً على البعد المحدد الذي تحتاجه ، عند الطلب. ال Django ImageFit المكتبة تفعل ذلك بالضبط ، كما أنها تمنح إمكانية المحاصيل.

في مثالك ستكتب {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }} وستنتهي مع صورة بحجم 120 × 45.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top