您的位置:

最佳方案处理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"的异常。