最佳方案处理tornado Exception("WSGI app did not call start_response")
发布时间:2023-02-01 10:30:01
报错的原因这个异常在python中Tornado中出现,是由于在使用Tornado的WSGI应用程序接口运行WSGI应用程序时,该应用程序未调用start_response函数导致的。start_response函数是WSGI协议中的一部分,用于将HTTP状态码和响应头传递给服务器,因此调用它是必需的。具体来说,在使用Tornado的WSGI接口运行应用程序时,需要在应用程序的入口点中调用start_response函数,并在返回响应数据之前调用它。然后使用Tornado的WSGIContainer类将应用程序包装在一个容器中,并使用Tornado的HTTPServer类在本地端口上启动服务器。
报错的原因
"WSGI app did not call start_response"这个异常在python中Tornado中出现,是由于在使用Tornado的WSGI应用程序接口运行WSGI应用程序时,该应用程序未调用start_response函数导致的。start_response函数是WSGI协议中的一部分,用于将HTTP状态码和响应头传递给服务器,因此调用它是必需的。
如何解决
解决方案是在你的WSGI应用程序中正确调用start_response函数。具体来说,在使用Tornado的WSGI接口运行应用程序时,需要在应用程序的入口点中调用start_response函数,并在返回响应数据之前调用它。
例如:
def my_wsgi_app(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/plain')]
start_response(status, headers)
return [b"Hello World"]
这种方式在应用程序的入口点中调用了start_response函数并返回响应数据。
正确调用start_response函数后,"WSGI app did not call start_response"这个异常就不会再出现。
使用例子
是的,下面是一个使用Tornado的WSGI应用程序的示例:
import tornado.httpserver
import tornado.ioloop
import tornado.wsgi
def my_wsgi_app(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/plain')]
start_response(status, headers)
return [b"Hello World"]
if __name__ == '__main__':
container = tornado.wsgi.WSGIContainer(my_wsgi_app)
http_server = tornado.httpserver.HTTPServer(container)
http_server.listen(8000)
tornado.ioloop.IOLoop.instance().start()
在这个例子中,my_wsgi_app函数是一个简单的WSGI应用程序,它在入口点中调用了start_response函数并返回响应数据。然后使用Tornado的WSGIContainer类将应用程序包装在一个容器中,并使用Tornado的HTTPServer类在本地8000端口上启动服务器。
这个例子中,应用程序正确调用了start_response函数,所以不会出现"WSGI app did not call start_response"的异常。