使用WSGI创建动态图像,不涉及任何文件
-
05-07-2019 - |
题
我想将动态创建的图像发送给我的用户,例如图表,图表等。这些图像是“扔掉”的。图像,它们只会被发送给一个用户,然后被销毁,因此“没有涉及文件”。
我想将图像直接发送给用户,而不是先将其保存在文件系统中。使用PHP,可以通过将HTML文件中的图像链接到PHP脚本来实现,例如:
编辑:SO吞下了我的图片代码:
<img src="someScript.php?param1=xyz">
然后脚本将正确的标题(filetype =&gt; jpeg等)发送到浏览器并直接将图像写回客户端,而不是暂时将其保存到文件系统。
我怎么能用WSGI应用程序做这样的事情。目前我正在使用Python的内部SimpleWSGI服务器。我知道这个服务器主要用于演示目的而不是实际使用,因为它缺乏多线程功能,所以请不要指出这一点,我知道这一点,现在它满足了我的要求: )
是否真的如将URL放入图像标记并使用WSGI处理请求一样简单,还是有更好的做法?
有没有人有这方面的经验,可以给我一些指示(请不要32位)
谢谢,
汤姆
解决方案
它与WSGI或php或任何其他特定的Web技术无关。考虑
<img src="someScript.php?param1=xyz">
一般来说,对于url someScript.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的网址都会返回有效图片,您可以在任何 img
标记或任何其他可以使用图片的标记位置使用它。 css或背景图片
可以使用许多第三方库动态生成图像数据,例如PIL等 例如,参见使用python成像库动态生成图像的示例 http://lost-theory.org/python/dynamicimg.html
其他提示
YES。它就像在网页中放置网址一样简单。
<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服务器上并不是典型的。如果操作正确,则不需要线程就能获得良好的性能。
如果你有一个完善的事件循环,可以在不同的请求之间切换,并以无线程友好的方式编写你的请求处理代码(通过尽可能频繁地将控制权返回给服务器),你甚至可以得到比使用线程更好的性能,因为它们不会使任何运行更快并增加开销。
请参阅 twisted.web ,了解不使用线程的优秀python Web服务器实现
有关使用此技术的精彩示例,请参阅 BNF铁路 图WHIFF迷你演示。您可以从WHIFF wsgi工具包下载获取源代码。
您应该考虑使用并注意ETag标头。这是一个CGI脚本,而不是WSGI,但这些想法是可以翻译的: sparklines来源 - 它碰巧总是为相同的参数返回相同的图像,所以它实现了极端的缓存。