0

我需要有一个 Python 文件,就像它是一个图像一样。即 Python 文件的路径将在网页的标签内使用。Python 文件将使用 PIL 动态创建图像(没有中间保存到文件)。

我正在使用 Python 2.7、Web.Py 和 PIL,并在 32 位 Windows XP 上进行开发,使用 WAMPSS Web 服务器,并使用最新的 Chrome。

我快到。我认为。

这是我的 python 图像文件的简化示例:

#!/home/bin/python
# #############################################################################
import web, sys
from PIL import Image, ImageDraw, ImageFont
# #############################################################################
class debug:
    def GET(self):
        # drawing with PIL (Python Image Library)
        # create a new 256x256 pixel image surface (default is black bg)
        img = Image.new("RGB", (256, 256))
        # set up the new image surface for drawing
        draw = ImageDraw.Draw (img)
        # REMOVED - Image manipulation
        # Output the image to the browser
        sys.stdout.write('Status: 200 OK\r\n')
        sys.stdout.write('Content-type: image/png\r\n')
        sys.stdout.write('\r\n')
        img.save(sys.stdout, "PNG")
# #############################################################################
urls = ( '/debug.py', 'debug' )
app = web.application(urls, globals())
if __name__ == "__main__":
    app.run()
# #############################################################################

现在,这行得通……有点。

如果我直接在浏览器(本地 AMPSS 服务器)中查看此文件,它会显示图像。但是,与类似的 1k PNG 图像相比,显示/服务器需要很长时间(5 秒以上)。Chrome 控制台说它失败了(虽然我可以看到图像)

我认为浏览器期待其他我没有发送的东西?

当我在 JQuery 和 OnLoad 事件中使用此图像时,真正的问题就出现了。然后事情变得……奇怪……因为缺少更好的词。我似乎有事件(不是我的)在加载和显示后数秒内清除图像。

Chrome 控制台说在检索图像时 GET 失败(尽管它确实显示了图像,至少在 JS 中的某些东西使它再次消失之前!)

有趣的是,这个问题似乎没有出现在最新的 Firefox 中。在最新的 Opera 中加载时间被夸大了,但是 JS 并没有出现图像故障。在 IE8 中也一样

更令人困惑的是,我有两台 Windows XP(32 位)开发机器。其中之一不会发生 JS 故障。而且 Chrome 控制台没有列出任何故障!

我在此处在线放置了图像文件的演示:LINKY 以及我在此处使用此文件的开发页面:LINKY 如果您在白色图像持有者周围单击,Jquery/JS 将激活。

我不知道这是否适用于您的设置。我只是为了完整性而在这里链接。

关于我所缺少的任何想法?

4

1 回答 1

2

在 web.py 中,您应该返回必须发送到浏览器的内容。也用于web.header设置 HTTP 标头。

保存图像StringIO并返回其内容:

import StringIO

# in GET(self):
web.header('Content-type', 'image/png')
buf = StringIO.StringIO()
img.save(buf, "PNG")
contents = buf.getvalue()
return contents
于 2013-02-19T16:55:04.587 回答