是否可以对ServerSent Events(SSE)使用gzip压缩?

2024-06-26 11:24:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否可以启用gzip压缩 对于服务器发送的事件(SSE;内容类型:文本/事件流)。在

根据这本书,似乎有可能: http://chimera.labs.oreilly.com/books/1230000000545/ch16.html

但是我找不到任何使用gzip压缩的SSE示例。我试过了 发送带有响应头字段的gzip消息 Content Encoding未成功设置为“gzip”。在

为了围绕SSE进行试验,我正在测试一个小型web应用程序 用Python制作的瓶子框架+gevent;我只是在运行 瓶子WSGI服务器:

@bottle.get('/data_stream')
def stream_data():
    bottle.response.content_type = "text/event-stream"
    bottle.response.add_header("Connection", "keep-alive")
    bottle.response.add_header("Cache-Control", "no-cache")
    bottle.response.add_header("Content-Encoding", "gzip")
    while True:
        # new_data is a gevent AsyncResult object,
        # .get() just returns a data string when new
        # data is available
        data = new_data.get()
        yield zlib.compress("data: %s\n\n" % data)
        #yield "data: %s\n\n" % data

没有压缩(最后一行,注释)和没有gzip的代码 内容编码头字段的工作方式很有魅力。在

编辑:多亏了回复和另一个问题:Python: Creating a streaming gzip'd file-like?,我成功地解决了这个问题:

^{pr2}$

Tags: addbottle内容newdatastreamgetresponse
2条回答

DR:如果请求没有被缓存,那么您可能希望使用zlib并将内容编码声明为“deflate”。仅此更改就可以使您的代码正常工作。在


如果将内容编码声明为gzip,则需要实际使用gzip。它们基于相同的压缩算法,但是gzip有一些额外的帧。例如,这是可行的:

import gzip
import StringIO
from bottle import response, route
@route('/')
def get_data():
    response.add_header("Content-Encoding", "gzip")
    s = StringIO.StringIO()
    with gzip.GzipFile(fileobj=s, mode='w') as f:
        f.write('Hello World')
    return s.getvalue()

不过,这只有在使用实际文件作为缓存时才有意义。在

还可以使用中间件,这样就不必担心为每个方法gzip响应。这是我最近用过的。在

https://code.google.com/p/ibkon-wsgi-gzip-middleware/

这就是我使用它的方式(我正在使用瓶子.py使用gevent服务器)

from gzip_middleware import Gzipper
import bottle
app = Gzipper(bottle.app())
run(app = app, host='0.0.0.0', port=8080, server='gevent')

对于这个特定的库,您可以通过修改DEFAULT_COMPRESSABLES variable来设置要压缩的w/c响应类型

^{pr2}$

所有的响应都会通过中间件并在不修改现有代码的情况下进行gzip处理。默认情况下,它压缩内容类型属于DEFAULT_COMPRESSABLES且内容长度大于200个字符的响应。在

相关问题 更多 >