2010-08-18 11 views
5

Ich habe eine Ansicht in meiner Django-Anwendung, die automatisch ein Bild mit dem PIL erstellt, es auf dem Nginx-Medienserver speichert und eine HTML-Vorlage mit einem img-Tag zurückgibt, das auf die URL verweist.Django und dynamisch generierte Bilder

Das funktioniert gut, aber ich merke ein Problem. Für alle 5 Male greife ich auf diese Ansicht zu, in einem von ihnen wird das Bild nicht dargestellt.

ich einige Untersuchungen gemacht und ich habe etwas Interessantes gefunden, das ist die HTTP-Response-Header, wenn das Bild richtig macht:

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 

und dies ist der Header, wenn das Bild nicht geladen wird:

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 

Beachten Sie, dass der Inhalt-Lenth gleich Null ist. Was könnte das verursacht haben? Irgendwelche Ideen, wie ich dieses Problem weiter debuggen könnte?

Bearbeiten: Wenn die Ansicht aufgerufen wird, ruft es diese "Draw" -Methode des Modells. Dies ist im Grunde, was es tut (Ich entfernte den Großteil des Codes für Klarheit):

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: Dies ist Webseite: http://xxxcnn7979.hospedagemdesites.ws:8000/cartao/99/

wenn Sie halten auf der rechten Seite F5, um das Bild treffen wird eventuell rendern.

+0

Wenn der Inhalt Länge Null ist, kann man sagen, ob das Bild erfolgreich erzeugt wurde und auf dem Server vorhanden? –

+0

Ja, es wurde korrekt generiert, wenn Sie versuchen, auf die Bild-URL zuzugreifen, die direkt geöffnet wird. –

+0

Warum hängen Sie die get-Abfragezeichenfolge an und variieren sie? –

Antwort

4

Wir hatten dieses Problem vor einiger Zeit beim Schreiben von HTML-Seiten auf die Festplatte. Die Lösung für uns bestand darin, in eine temporäre Datei zu schreiben und dann die Datei atomar umzubenennen. Sie können auch die Verwendung von fsync in Betracht ziehen.

Die vollständige Quelle ist hier verfügbar: staticgenerator/__init__.py, aber hier sind die Nutzbits:

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)