2010-08-18 10 views
5

Tengo una vista en mi aplicación Django que crea automáticamente una imagen usando el PIL, la almacena en el servidor de medios Nginx y devuelve una plantilla html con una etiqueta img que apunta a su url.Django e imágenes generadas dinámicamente

Esto funciona bien, pero veo un problema. Por cada 5 veces que accedo a esta vista, en 1 de ellas la imagen no se procesa.

he hecho un poco de investigación y me encontré con algo interesante, este es el encabezado de respuesta HTTP cuando la imagen se muestre correctamente:

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 

y esta es la cabecera cuando la imagen no se carga:

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 

Observe que Content-Lenth es igual a cero. ¿Qué pudo haber causado esto? ¿Alguna idea sobre cómo podría depurar aún más este problema?

Editar: Cuando se invoca la vista, llama a este método "dibujar" del modelo. Esto es básicamente lo que hace (me quita la mayor parte del código para mayor claridad):

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: Este es el sitio web: http://xxxcnn7979.hospedagemdesites.ws:8000/cartao/99/

si se mantiene golpear F5 la imagen de la derecha se eventualmente render.

+0

Cuando el contenido de longitud es cero, se puede saber si la imagen se generó correctamente y existe en el servidor? –

+0

Sí, se generó correctamente, cuando intenta acceder a la url de la imagen directamente se abre. –

+0

¿Por qué anexa y varía la cadena de consulta get? –

Respuesta

4

Tuvimos este problema hace un tiempo cuando escribíamos páginas HTML en el disco. La solución para nosotros era escribir en un archivo temporal y luego cambiar el nombre atómicamente del archivo. También es posible que desee considerar el uso de fsync.

La fuente completo está disponible aquí: staticgenerator/__init__.py, pero aquí están los bits útiles:

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) 
Cuestiones relacionadas