2010-08-18 19 views
5

Django uygulamasında, PIL kullanarak otomatik olarak görüntü oluşturan, Nginx medya sunucusunda saklayan ve URL'sini işaret eden bir img etiketli bir html şablonu döndüren bir görünüm var.Django ve dinamik olarak oluşturulmuş resimler

Bu iyi çalışıyor, ancak bir sorun olduğunu fark ettim. Her 5 kez bu görüntüye erişiyorum, bunlardan 1 tanesinde görüntü oluşmuyor.

Bazı araştırma yaptı ve ilginç bir şey buldum, görüntü düzgün oluşturulduğunda bu HTTP yanıt başlığıdır:

Accept-Ranges:bytes 
Connection:keep-alive 
Content-Length:14966 
Content-Type:image/jpeg 
Date:Wed, 18 Aug 2010 15:36:16 GMT 
Last-Modified:Wed, 18 Aug 2010 15:36:16 GMT 
Server:nginx/0.5.33 

ve görüntü yükü değil yaptığında bu başlık budur:

Accept-Ranges:bytes 
Connection:keep-alive 
Content-Length:0 
Content-Type:image/jpeg 
Date:Wed, 18 Aug 2010 15:37:47 GMT 
Last-Modified:Wed, 18 Aug 2010 15:37:46 GMT 
Server:nginx/0.5.33 

Content-Lenth öğesinin sıfıra eşit olduğuna dikkat edin. Buna ne sebep olmuş olabilir? Bu sorunu nasıl daha fazla ayıklayabileceğime dair herhangi bir fikir var mı?

Düzenleme: Görünüm çağrıldığında, modelin bu "çizim" yöntemini çağırır. Bu web sitesidir:

def draw(self): 
    # Open/Creates a file 
    if not self.image: 
     (fd, self.image) = tempfile.mkstemp(dir=settings.IMAGE_PATH, suffix=".jpeg") 
     fd2 = os.fdopen(fd, "wb") 
    else: 
     fd2 = open(os.path.join(settings.SITE_ROOT, self.image), "wb") 

    # Creates a PIL Image 
    im = Image.new(mode, (width, height)) 

    # Do some drawing 
    ..... 

    # Saves 
    im = im.resize((self.get_size_site(self.width), 
        self.get_size_site(self.height))) 
    im.save(fd2, "JPEG") 
    fd2.close() 

Edit2: Bu ne işe yaradığını temelde (Ben netlik için kod toplu kaldırıldı) http://xxxcnn7979.hospedagemdesites.ws:8000/cartao/99/

F5 sağdaki görüntü isabet devam edersek olacak sonunda ortaya çıkar.

+0

içerik uzunluğu görüntü başarıyla oluşturulduğu olmadığını anlamanın, sıfırdır ve sunucuda var? –

+0

Evet, görüntü URL'sine doğrudan erişmeye çalıştığınızda doğru oluşturuldu. –

+0

Neden get sorgu dizgesini ekler ve değiştirirsiniz? –

cevap

4

HTML sayfalarını diske yazarken bu sorunu bir süre önce yaşadık. Çözüm bizim için geçici bir dosyaya yazıp dosyayı atomla yeniden adlandırmaktı. Ayrıca fsync kullanmayı düşünebilirsiniz.

tam kaynak burada mevcuttur: staticgenerator/__init__.py, ama burada kullanışlı bit şunlardır:

import os 
import stat 
import tempfile 

... 

f, tmpname = tempfile.mkstemp(dir=directory) 
os.write(f, content) 
# See http://docs.python.org/library/os.html#os.fsync 
f.flush() 
os.fsync(f.fileno()) 
os.close(f) 
# Ensure it is webserver readable 
os.chmod(tmpname, stat.S_IREAD | stat.S_IWRITE | stat.S_IWUSR | stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH) 
# Rename is an atomic operation in POSIX 
# See: http://docs.python.org/library/os.html#os.rename 
os.rename(tmpname, fn) 
İlgili konular