Python Twisted HTTP代理
我刚开始学习Python,正在接触Twisted这个库。在Twisted的文档中,我看到只用这一段代码就可以搭建一个代理服务器。
class MyProxy(proxy.Proxy):
pass
class ProxyFactory(http.HTTPFactory):
protocol = MyProxy
reactor.listenTCP(8080, ProxyFactory())
reactor.run()
ProxyFactory::protocol
看起来像是一个成员变量?但是 MyProxy
是一个类型名,我不太明白这是不是一种模板?否则我怎么能把一个类型赋值给一个变量呢?
我其实想做的就是拒绝对某些特定接口的请求。我在考虑重写 buildProtocol
,但传入的参数 addr
总是127.0.0.1。
1 个回答
3
ProxyFactory.protocol
是一个 Python 类的属性。因为 Python 是一种动态类型的语言,所以它在定义变量和类方面比 Java 更灵活。
MyProxy 是一个空的类,它是 Proxy 的子类,但并没有定义任何额外的行为,完全使用 proxy.Proxy 提供的默认功能。你可能需要做的事情(我对 Twisted 的内部结构不是很了解)是查看 proxy.Proxy 类的文档,并通过在 MyProxy 中重新定义一些方法来覆盖它们,这样这些方法就能执行你想要的逻辑。
如果你查看 Twisted API 文档的源代码,似乎添加自定义逻辑的好地方是 ProxyRequest.procese(),这个方法在解析完传入的 HTTP 请求后开始连接远程主机。
所以你(可能)需要继承 ProxyRequest 类,并通过 requestFactory
类属性将其提供给你的 MyProxy。