我写了一个烧瓶应用程序作为代理,分析通过它的数据,并提供一个网页,我得到结果。当使用随附烧瓶的默认开发服务器时,一切似乎都很顺利,比如使用:
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.url
是http://example.com/test
。
当使用其他两种方式时,请求由错误处理程序使用代码404处理,并且永远不会调用handle_test()
函数。似乎导致问题的request.url
是http://example.com/http://example.com/test
,绝对不是我想要的。
所以我想知道:
谢谢!
答案 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应用程序(没有烧瓶)以利用异步功能。