3

我想将动态创建的图像发送给我的用户,例如图表、图形等。这些图像是“丢弃”图像,它们只会发送给一个用户然后被销毁,因此“不涉及文件”。

我想直接将图像发送给用户,而不是先将其保存在文件系统上。使用 PHP,这可以通过将 HTML 文件中的图像链接到 PHP 脚本来实现,例如:

编辑:所以吞下了我的图像标签:

<img src="someScript.php?param1=xyz">

然后脚本将正确的标头(filetype=>jpeg 等)发送到浏览器,并直接将图像写回客户端,而不是将其临时保存到文件系统中。

我怎么能用 WSGI 应用程序做这样的事情。目前我正在使用 Python 的内部 SimpleWSGI 服务器。我知道该服务器主要用于演示目的而不是实际使用,因为它缺乏多线程功能,所以请不要向我指出这一点,我知道,现在它满足我的要求: )

是否真的像将 URL 放入图像标签并使用 WSGI 处理请求一样简单,还是有更好的做法?

有没有人有这方面的经验,可以给我一些指示(请不要32位)

谢谢,

汤姆

4

4 回答 4

9

它与 WSGI 或 php 或任何其他特定的 Web 技术无关。考虑

<img src="someScript.php?param1=xyz">

通常对于 urlsomeScript.php?param1=xyz服务器应该返回图像类型的数据并且它会工作

考虑这个例子:

from wsgiref.simple_server import make_server

def serveImage(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'image/png')]
    start_response(status, headers)

    return open("about.png", "rb").read()

httpd = make_server('', 8000, serveImage)
httpd.serve_forever()

这里任何指向 serveImage 的 url 都将返回一个有效的图像,您可以在任何img标签或任何其他可以使用图像的标签位置使用它,例如 css 或背景图像

可以使用许多第三方库(例如 PIL 等)即时生成图像数据,例如查看使用 python 图像库 http://lost-theory.org/python/dynamicimg.html动态生成图像的示例

于 2009-06-16T12:14:19.507 回答
2

是的。就像将 url 放在页面中一样简单。

<img src="url_to_my_application">

并且您的应用程序只需使用正确的 mimetype 返回它,就像在 PHP 或其他任何东西上一样。最简单的例子:

def application(environ, start_response):
    data = open('test.jpg', 'rb').read() # simulate entire image on memory
    start_response('200 OK', [('content-type': 'image/jpeg'), 
                              ('content-length', str(len(data)))])
    return [data]

当然,如果您使用框架/帮助程序库,它可能具有帮助程序功能,这将使您更轻松。

我想补充一点,多线程功能在 Web 服务器上并不是典型的。如果正确完成,您不需要线程来获得良好的性能。

如果您有一个在不同请求之间切换的完善的事件循环,并以一种对线程友好的方式编写您的请求处理代码(通过尽可能频繁地将控制权返回给服务器),您可以获得比使用线程更好的性能,因为它们不会使任何东西运行得更快并增加开销。

有关不使用线程的良好 python Web 服务器实现,请参阅twisted.web 。

于 2009-06-16T12:12:47.747 回答
0

有关使用此技术的精美示例,请参阅 BNF 铁路图 WHIFF 迷你演示。您可以从 WHIFF wsgi 工具包下载中获取源代码。

于 2009-07-24T17:54:08.007 回答
0

You should consider using and paying attention to ETag headers. It's a CGI script, not WSGI, but the ideas are translatable: sparklines source -- it happens to always return the same image for the same parameters, so it practices extreme caching.

于 2009-07-30T21:26:25.390 回答