我正在寻求帮助Python的开源项目。 据我所知,扭不支持发送和以http接收gzip的信息: http://twistedmatrix.com/trac/ticket/104扭曲的http gzip支持
谷歌似乎也印证了它,因为我找不到它的任何一提的文档。 我的问题是我对此是否正确,或者这是否改变了? 或者,它对任何人都有用吗?我猜这有一个原因尚未实现。
很抱歉,如果这是不是要问正确的地方...
我正在寻求帮助Python的开源项目。 据我所知,扭不支持发送和以http接收gzip的信息: http://twistedmatrix.com/trac/ticket/104扭曲的http gzip支持
谷歌似乎也印证了它,因为我找不到它的任何一提的文档。 我的问题是我对此是否正确,或者这是否改变了? 或者,它对任何人都有用吗?我猜这有一个原因尚未实现。
很抱歉,如果这是不是要问正确的地方...
票仍然是开放的,所以它是正确的,这个功能还没有在扭曲使用。但是,Nevow支持发送gzip响应:http://bazaar.launchpad.net/~divmod-dev/divmod.org/trunk/view/head:/Nevow/nevow/compression.py。由于Nevow可以很容易地将Twisted Web一起使用,所以这可能是一种获得您想要的方式。
希望该功能也将从Nevow移植到Twisted Web。
现在可以使用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()
查看链接了解更多信息。问题中的票现在也关闭了。
重要的是要注意,在这个例子中,isLeaf被设置为true,所以包装的资源将被识别为具有编码器。如果isLeaf不是true,那么getChild将被调用,并且可能不会被EncodingResourceWrapper包装。 – Chris 2016-02-07 15:35:20
注意,返回的儿童的资源不会被包裹着,所以你 有,如果你想被应用的编码,以明确他们包裹。
所以,如果一个Resource
工具getChild
,那么你就需要来包装资源为好。
例如:
printf 'GET/HTTP/1.1\r\nHost: localhost\r\nAccept-Encoding: gzip,deflate\r\nConnection: close\r\n\r\n' | nc localhost 8080
我想扩大一点@ danbrough是万一别人的土地伟大的答案在这里:的 拳
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的测试所有,如果你碰巧把IResource.putChild
的孩子,他的解决方案将不会直接工作,你将不得不覆盖IResource.getChildWithDefault
,而不是只有IResource.getChild
。
这也恰好,即具有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)。
我怀疑很多关心HTTP gzip压缩的人在其他HTTP服务器(如Apache或nginx)后面运行twisted.web应用程序。因此,有扭曲的支持。网络并不特别有趣或重要。也就是说,没有理由为什么每个人都应该*有*在像这样的设置中运行他们的应用程序。像往常一样,答案是“为什么不实施呢?”只是“没有人做过这项工作”...... – mithrandi 2011-03-26 05:56:59