Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶作为代理不';当部署到龙卷风中时无法工作_Python_Proxy_Flask_Tornado - Fatal编程技术网

Python 烧瓶作为代理不';当部署到龙卷风中时无法工作

Python 烧瓶作为代理不';当部署到龙卷风中时无法工作,python,proxy,flask,tornado,Python,Proxy,Flask,Tornado,我编写了一个flask应用程序作为代理,分析通过它的数据,并提供一个网页,在那里我可以得到结果。使用flask附带的默认开发服务器时,一切似乎都进行得很顺利,比如使用: app.run() 但当我尝试将应用程序部署到服务器时,例如tornado或Python标准库中的wsgiref.simple_服务器,使用: from tornado.wsgi import WSGIContainer from tornado.httpserver import HTTPServer from tornad

我编写了一个flask应用程序作为代理,分析通过它的数据,并提供一个网页,在那里我可以得到结果。使用flask附带的默认开发服务器时,一切似乎都进行得很顺利,比如使用:

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

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()

这两种方法会导致在之前得到200 OK的请求上出现404错误

我的应用程序收到的请求,因为它作为代理,在请求行中有绝对URL,如
POSThttp://example.com/test HTTP/1.1
。当我使用开发服务器时,此请求通常由在
/test
下注册的函数处理,类似于:

@app.route('/test', methods=['GET', 'POST'])
def handle_test():
    ...
正如我所检查的,
request.url
,是
http://example.com/test

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

所以我想知道:

  • 是什么把url改错了,什么时候发生的
  • 为什么应用程序在默认开发服务器和tornado等服务器上表现不同
  • 当然,如何解决这个问题

  • 谢谢

    Tornado目前不支持代理式请求;看

    Tornado的WSGIContainer对于代理来说也是一个糟糕的选择,因为它的单线程并发模型(请参阅)。即使前面提到的bug已经修复,您的代理也会表现不佳。我建议要么使用多线程WSGI服务器(如gunicorn或uwsgi,尽管我不知道它们是否支持代理风格的请求),要么将代理重写为本机Tornado应用程序(不带flask),以利用异步功能

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