我希望用Python帮助一个开源项目。 据我所知,Twisted不支持使用http发送和接收gzip信息: http://twistedmatrix.com/trac/ticket/104
谷歌似乎证实了这一点,因为我找不到任何提及它的文件。 我的问题是我对此是否正确,或者这是否已经改变? 或者,它对任何人都有用吗?我想有一个原因尚未实施。对不起,如果这不是正确的地方......
答案 0 :(得分:6)
现在可以使用Resource Encoders。引用该链接:
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()
有关详细信息,请参阅链接。问题中的票证现在也已关闭。
答案 1 :(得分: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
答案 2 :(得分:3)
故障单仍处于打开状态,因此在Twisted中仍然无法使用此功能。但是,Nevow支持发送gzip压缩响应:http://bazaar.launchpad.net/~divmod-dev/divmod.org/trunk/view/head:/Nevow/nevow/compression.py。由于Nevow可以轻松地将Twisted Web结合使用,因此这可能是获得所需内容的一种方式。
希望有一天该功能也将从Nevow移植到Twisted Web。
答案 3 :(得分:1)
我想扩大一点@ danbrough的好答案以防其他人降落在这里:
所有的拳头,如果你碰巧把孩子放在IResource.putChild
,他的解决方案不会直接工作,你必须覆盖IResource.getChildWithDefault
而不是IResource.getChild
。< / p>
还有一种情况是,使用HTTP BasicAuthentication
保护一些资源并且使用Gzip
压缩它们有点棘手,因为上面的工作没有成功。在这种情况下,您需要摆弄HTTPAuthSessionWrapper
,如下所示:
class GzipAuthSessionWrapper(HTTPAuthSessionWrapper):
def getChildWithDefault(self, path, request):
child = HTTPAuthSessionWrapper.getChildWithDefault(self, path, request)
gzipChild = EncodingResourceWrapper(child, [GzipEncoderFactory()])
return gzipChild
您还必须像往常一样设置Realm
,Checkers
和Portal
(documentation)。