代码之家  ›  专栏  ›  技术社区  ›  Tom

使用wsgi创建动态图像,不涉及任何文件

  •  3
  • Tom  · 技术社区  · 17 年前

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

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

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

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

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

    我怎么能用一个wsgi应用程序做这样的事情呢?目前我使用的是python的内部simplewsgi服务器。我知道这台服务器主要是为了演示而不是实际使用,因为它缺乏多线程功能,所以请不要向我指出这一点,我知道这一点,目前它满足了我的要求:)

    它真的像将URL放入图像标签和使用wsgi处理请求一样简单吗,或者有更好的实践吗?

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

    谢谢,

    汤姆

    4 回复  |  直到 14 年前
        1
  •  8
  •   Anurag Uniyal    14 年前

    它与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的URL都将返回一个有效的图像,您可以在任何 img 标记或任何其他可以使用图像的标记位置,例如CSS或背景图像

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

        2
  •  2
  •   nosklo    17 年前

    对。这就像把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服务器上并不十分重要。如果操作正确,就不需要线程具有良好的性能。

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

    见 twisted.web 对于不使用线程的优秀python Web服务器实现。

        3
  •  0
  •   Aaron Watters    17 年前

    有关使用此技术的奇特示例,请参见 the BNF railroad diagram WHIFF mini-demo . 您可以从whiff wsgi工具包下载中获得源代码。

        4
  •  0
  •   ianb    17 年前

    您应该考虑使用和注意etag头。这是一个CGI脚本,不是WSGi,但这些想法是可翻译的: sparklines source --它总是为相同的参数返回相同的图像,因此它采用了极端缓存。