如何用扭曲的方式运行Klein?

时间:2016-05-03 20:34:18

标签: python python-3.x proxy twisted klein-mvc

我正在尝试使用twisted运行klein,因此我可以在不同的路径上运行扭曲的脚本(exp:example.com/example1example.com/example2)。所以我做了一个简单的脚本:

from klein import run, route, Klein
from twisted.internet import reactor
from twisted.web import proxy, server
from twisted.python import log

@route('/example')
def home(request):
    site = server.Site(proxy.ReverseProxyResource('www.example.com', 80, b''))
    reactor.listenTCP(80, site)
    reactor.run()

run("My_IP_Address", 80)

但每当我运行这个脚本时,我都会得到一个错误:twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 98] Address already in use.我对Klein很新,而且我不确定它是如何工作的,有人可以告诉我它是做错了吗?谢谢!

1 个答案:

答案 0 :(得分:2)

你所得到的这个例外似乎相当清楚它说:

Couldn't listen on any:80: [Errno 98] Address already in use.

当您尝试使用的端口号已被其他一些服务使用时,会发生这种情况。这个其他服务可以是Twisted之外的其他服务或两个Twisted服务。我假设你没有其他任何东西在端口80上监听(例如nginx或apache或其他一些web服务器,注意80是默认的HTTP端口,所以很多服务都可以在那里监听)并且你的问题是由启动两个引起的扭曲的网络服务。

在您的情况下,您尝试在一个端口上启动两个服务。

run("My_IP_Address", 80)

启动一个服务侦听端口80.

在/ example路由上收到请求后,您尝试在同一端口上启动另一项服务:

site = server.Site(proxy.ReverseProxyResource('www.example.com', 80, b''))
reactor.listenTCP(80, site)
reactor.run()

这没有逻辑意义,你不能在同一个端口上运行两个服务。这就是你得到这个例外的原因。你对reactor.run()的调用也没用,从klein导入的run()已经启动了reactor。

如果确实需要在某个请求后启动某个服务器(这看起来非常不寻常的用例),请在另一个端口启动它。但也许你有should simply start with官方文档和例子吗?