2010-01-21 21 views
8

URL'deki parametrelere dayalı olarak küçük resimler oluşturmak istiyorum. Örneğin, http://mysite.com/images/1234/120x45.jpg, resim kimliği 1234 için 120x45 küçük resmi oluşturur. Bu boyutta görüntünün önceden önbelleğe alınmış sürümü içinDinamik olarak küçük resim oluşturma (django kullanarak)

  1. Look:

    bu açık çözümü aşağıdakileri yapar bir django görünüme sahip olmaktır.

  2. Önbelleğe alınmadığında bir küçük resim oluşturun (kilitleme için bir mantık, böylece yalnızca 1 işlem küçük resmi ve diğer işlemleri bekler).
  3. Sonuçları django aracılığıyla yolla.

Bu "iş" etmeli, ancak performans konusunda endişeliyim. Statik içerik sunmak için django kullanma fikrini sevmiyorum. Bu problemi başarmanın başka yolları nelerdir?

+0

dinamik, o zaman gerçekten statik değil, küçük resim oluşturuyorsanız değil mi? –

+0

Bunu tembel yüklü bir statik küçük resim olarak düşünüyorum. Bir kez oluşturulduğunda, aynı performansı statik olsaydı beğenirim. – Gattster

cevap

8

Statik içeriğe doğrudan hizmet vermek için Django kullanmak zorunda değilsiniz. Sunucu klasörünüze 404 isteklerinizi bir Django görünümüne yönlendirin, burada dosya adını ayırın ve orijinal URL'ye yeniden yönlendirmeden önce uygun küçük resmi oluşturur (umarız artık 404 olmaz). Diğer Cevabım django-imagekit öneri gelince

, ben dinamik URL'sini temel görüntü başparmak oluşturmak izin için her şeyi yapan emin değilim, ama kesinlikle o var tüm özellikleri için kullanmaya tavsiye ederiz.

Düzenleme:

fiili URL yapısına gelince, daha kolay dinamik küçük resim üretimiyle ilgisi olmayan 404 isteklerini filtrelemek için izin verecek /images/filename-120x45.jpg daha tipik hissediyorum. Örneğin, /images/original_size_image.jpg için 404 hata ton olduğunu varsayalım. Bunların Django'ya yönlendirilmesini istemezsiniz ve bu formatın dosya adlarını yalnızca regex ile eşleştirebilirsiniz. [son düzenle]

Bu özellikten haberdar olan herkesin Django uygulamanızdan haberdar olmasını sağlamak için dikkatli olmalısınız. Potansiyel olarak parmak uçlarında sonsuz sayıda görüntü boyutu ve dosya adı birleşimi ile onu öldürebilirler. Bu istekler üzerinde üst sınırların nasıl koyulacağını, her iki boyutun da orijinalinden daha büyükse, hatta aynı görüntünün birden çok boyutuna yönelik isteklerin nasıl karşılanacağını bulmak gibi bir geri dönüşü 404'e nasıl yönlendireceğinizi öğrenmeniz gerekir. Belki de bu "kilitleme" den bahsederken aldığınız şeydi.

Bir kenara baktığımda, Apache'yi etiketlediğinizi görüyorum ancak Nginx gibi bir şey aracılığıyla statik içerik sunmanızı tavsiye ederim. Statik dosyaları sunmada tam bir kayıt olmayan bir statik dosya sunucusu kullanıyorsanız, dinamik görüntü isteklerinin ek yükünü belki de ortadan kaldırabilirsiniz.

+0

Harika cevap. Spam sorununa bir çözüm, önceden tanımlanmış izin verilen resim/küçük resim listesine sahip olmaktır. Ayrıca, ben nginx üzerinde katılıyorum. Şu anda statik içerik sunmak için nginx kullanıyorum ve bu soruya nginx etiketini ekleyeceğim. – Gattster

+0

Ah, evet… ama izin verilen boyutların önceden tanımlanmış bir listesinin size nasıl "dinamik" olacağından emin değildim, bundan bahsetmedim. Aynı zamanda görüntü formatlarınızdan emin değildim ve eğer tutarlı veya standart oranlarsa ya da önceden belirlenmiş bir boyuta, vs'ye uymuyorsa başparmağını kırpmayı planlıyorsanız. Ayrıca, cevabımı anlık olarak düzenleyeceğim tartıştığınız URL formatı hakkında bir şey eklemek için – jonwd7

+0

Bunun için şişe kullanıyorum ama aynı prensibi kullanarak çalıştı. Bu şekilde çalıştığı harika bir şey. Sadece bağlantı içeren –

4

Ayrıca sorl deneyebilirsiniz, o Satchmo tarafından kullanılıyor.

2

the sorl-thumbnail documentation numaralı telefondan bir göz atabilirsiniz.Birlikte /media/ dir gelen Nginx statik içerik hizmet veren hemen hemen tüm projelerin kullanmak :)

2

ben bu yanıtları baktı ve çalıştıkları halde onlar sadece benim için de sofisticated bulundu. sadece en iyi çağrı olabilir PIL kitaplığı kullanarak, küçük resimleri almak için hızlı ve kirli bir şekilde istiyorsanız , bu benim kodudur:

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 kitaplığı here

Cheers İndir, bu umutlar birine yardım eder.

0

Kontrol dışarı Django için küçük katkısı hakkında bu tartışma sayfasını:

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

+0

Cevaplar [kötü uygulama olarak kabul edilir] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Lütfen içeriği burada özetleyin (kopyalama/yapıştırma), böylece cevap kendi başına durabilir. Cevabınız kaldırılmıyorsa, özellikle de bağlantıyı kaybederseniz riski ortadan kaldırırsınız. –

4

başparmak oluşturmak için bu uygulamayı bakın.

Python'da, tornadoweb sunucusunu kullanarak geliştirildi.

https://github.com/globocom/thumbor

pip install thumbor 

Büyük Uygulaması

Aynı kesin sorun vardı
+0

Thumbor gerçekten OP'nin istediği her şeyi yapıyor. –

0

: Yüksek trafik sitesinde, tepki zamanda küçük onlarca üreten tüm geçmiş için üreten küçük resimler olduğu gibi, mümkün değildir içerik toplu, bu yüzden bunun için bir uygulama oluşturdum. Şunlara dikkat edin:

İlgili konular