Twisted http gzip 支持
我想帮一个开源项目,使用Python。
根据我了解到的信息,Twisted 不 之前不支持通过HTTP发送和接收gzip格式的信息(截至2011年)。http://twistedmatrix.com/trac/ticket/104
谷歌似乎也证实了这一点,因为我在文档中找不到任何相关的说明。我的问题是,我的理解是否正确,或者说这个情况有没有变化?另外,这个功能对任何人真的有用吗?我想可能是因为没有人实现它,所以才没有被加入。
如果在这里问不合适,我很抱歉……
4 个回答
2
这个问题还在处理当中,所以说这个功能在Twisted里还没有实现是对的。不过,Nevow已经支持发送经过gzip压缩的响应:http://bazaar.launchpad.net/~divmod-dev/divmod.org/trunk/view/head:/Nevow/nevow/compression.py。因为Nevow和Twisted Web可以很方便地一起使用,所以这可能是实现你想要的功能的一种方法。
希望将来这个功能也能从Nevow移植到Twisted Web上。
6
来自EncodingResourceWrapper
的文档:
请注意,返回的子资源不会被自动包装,所以如果你想要应用编码,就必须手动去包装它们。
也就是说,如果一个Resource
实现了getChild
方法,那么你也需要把这个资源包装起来。
举个例子:
from twisted.web.server import Site, GzipEncoderFactory
from twisted.web.resource import EncodingResourceWrapper
from twisted.web import static
from twisted.internet import reactor
from twisted.python import log
import sys
log.startLogging(sys.stdout)
class WebServer(static.File):
def getChild(self, path, request):
child = static.File.getChild(self, path, request)
return EncodingResourceWrapper(child, [GzipEncoderFactory()])
resource = WebServer('/tmp')
site = Site(resource)
reactor.listenTCP(8080, site)
reactor.run()
你可以用netcat来测试:
printf 'GET / HTTP/1.1\r\nHost: localhost\r\nAccept-Encoding: gzip,deflate\r\nConnection: close\r\n\r\n' | nc localhost 8080
6
现在可以使用资源编码器来实现这个功能。引用一下那个链接的内容:
from twisted.web.server import Site, GzipEncoderFactory
from twisted.web.resource import Resource, EncodingResourceWrapper
from twisted.internet import reactor
class Simple(Resource):
isLeaf = True
def render_GET(self, request):
return "<html>Hello, world!</html>"
resource = Simple()
wrapped = EncodingResourceWrapper(resource, [GzipEncoderFactory()])
site = Site(wrapped)
reactor.listenTCP(8080, site)
reactor.run()
想了解更多信息,可以查看这个链接。问题中的票据现在也已经关闭了。