作为代理的Flask在部署到龙卷风时不起作用

时间:2015-02-25 19:23:18

标签: python proxy flask tornado

我写了一个烧瓶应用程序作为代理,分析通过它的数据,并提供一个网页,我得到结果。当使用随附烧瓶的默认开发服务器时,一切似乎都很顺利,比如使用:

app.run()

但是当我尝试将应用程序部署到服务器时,例如使用Python标准库中的tornado或wsgiref.simple_server:

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from app import app

http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()

from wsgiref.simple_server import make_server
from app import app

httpd = make_server('', 5000, app)
httpd.serve_forever()

这两种方式导致在先前获得200 OK的请求中获得404错误。

我的应用程序获取的请求,因为它充当代理,在请求行中使用绝对URL,如POST http://example.com/test HTTP/1.1。当我使用开发服务器时,此请求通常由/test下注册的函数处理,如:

@app.route('/test', methods=['GET', 'POST'])
def handle_test():
    ...

,我检查过的request.urlhttp://example.com/test

当使用其他两种方式时,请求由错误处理程序使用代码404处理,并且永远不会调用handle_test()函数。似乎导致问题的request.urlhttp://example.com/http://example.com/test,绝对不是我想要的。

所以我想知道:

  1. 是什么将网址更改为错误的网址,以及何时发生这种情况。
  2. 为什么应用程序在默认开发服务器和龙卷风等服务器上的行为方式不同。
  3. 当然,如何摆脱这个问题。
  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

Tornado目前不支持代理式请求;见https://github.com/tornadoweb/tornado/issues/1036

由于其单线程并发模型(参见http://www.tornadoweb.org/en/stable/wsgi.html#tornado.wsgi.WSGIContainer),Tornado的WSGIContainer对于代理来说也是一个糟糕的选择。即使修复了上述错误,您的代理也会表现不佳。我建议使用多线程WSGI服务器(如gunicorn或uwsgi,虽然我不知道它们是否支持代理风格的请求),或者将代理重写为本机Tornado应用程序(没有烧瓶)以利用异步功能。