代码之家  ›  专栏  ›  技术社区  ›  Cesar Canassa

Django和动态生成的图像

  •  5
  • Cesar Canassa  · 技术社区  · 16 年前

    我的Django应用程序中有一个视图,它使用PIL自动创建一个图像,将其存储在Nginx媒体服务器中,并返回一个html模板,其中一个img标记指向它的url。

    这很好,但我注意到一个问题。每5次访问此视图,其中1次图像不会渲染。

    我做了一些调查,发现了一些有趣的事情,这是正确呈现图像时的HTTP响应头:

    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
    

    这是图像未加载时的标题:

    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等于零。是什么造成的?关于如何进一步调试这个问题有什么想法吗?

    编辑: 调用视图时,它调用模型的这个“绘制”方法。这就是它的基本功能(为了清晰起见,我删除了大部分代码):

    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()
    

    这是网站: http://xxxcnn7979.hospedagemdesites.ws:8000/cartao/99/

    如果一直按F5键,右侧的图像最终将渲染。

    1 回复  |  直到 16 年前
        1
  •  4
  •   Erik Karulf    16 年前

    fsync .

    staticgenerator/__init__.py ,但这里有一些有用的信息:

    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)