python – Django和动态生成的图像

前端之家收集整理的这篇文章主要介绍了python – Django和动态生成的图像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

  1. Accept-Ranges:bytes
  2. Connection:keep-alive
  3. Content-Length:14966
  4. Content-Type:image/jpeg
  5. Date:Wed,18 Aug 2010 15:36:16 GMT
  6. Last-Modified:Wed,18 Aug 2010 15:36:16 GMT
  7. Server:Nginx/0.5.33

这是图像未加载时的标题

  1. Accept-Ranges:bytes
  2. Connection:keep-alive
  3. Content-Length:0
  4. Content-Type:image/jpeg
  5. Date:Wed,18 Aug 2010 15:37:47 GMT
  6. Last-Modified:Wed,18 Aug 2010 15:37:46 GMT
  7. Server:Nginx/0.5.33

注意Content-Lenth等于零.可能是什么导致了这个?关于如何进一步调试此问题的任何想法?

编辑:
调用视图时,它会调用模型的“绘制”方法.这基本上就是它的作用(为清楚起见,我删除了大部分代码):

  1. def draw(self):
  2. # Open/Creates a file
  3. if not self.image:
  4. (fd,self.image) = tempfile.mkstemp(dir=settings.IMAGE_PATH,suffix=".jpeg")
  5. fd2 = os.fdopen(fd,"wb")
  6. else:
  7. fd2 = open(os.path.join(settings.SITE_ROOT,self.image),"wb")
  8. # Creates a PIL Image
  9. im = Image.new(mode,(width,height))
  10. # Do some drawing
  11. .....
  12. # Saves
  13. im = im.resize((self.get_size_site(self.width),self.get_size_site(self.height)))
  14. im.save(fd2,"JPEG")
  15. fd2.close()

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

如果你继续按F5,右边的图像最终会渲染.

最佳答案
在将HTML页面写入磁盘时,我们暂时遇到了这个问题.我们的解决方案是写入临时文件,然后以原子方式重命名文件.您可能还想考虑使用fsync.

完整的源代码可以在这里找到:staticgenerator/__init__.py,但这里是有用的位:

  1. import os
  2. import stat
  3. import tempfile
  4. ...
  5. f,tmpname = tempfile.mkstemp(dir=directory)
  6. os.write(f,content)
  7. # See http://docs.python.org/library/os.html#os.fsync
  8. f.flush()
  9. os.fsync(f.fileno())
  10. os.close(f)
  11. # Ensure it is webserver readable
  12. os.chmod(tmpname,stat.S_IREAD | stat.S_IWRITE | stat.S_IWUSR | stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
  13. # Rename is an atomic operation in POSIX
  14. # See: http://docs.python.org/library/os.html#os.rename
  15. os.rename(tmpname,fn)

猜你在找的Nginx相关文章