Flask API突然无法接收请求

9

我正在尝试在Flask中创建一个REST API。问题是它可以完美运行几天,然后突然就完全停止接收请求了。不要谈论不回应请求的问题;它根本没有在第一时间接收到任何请求。这是我的脚本:

from flask import Flask, jsonify
from flask_restful import Resource, Api
from flask_restful import reqparse
from sqlalchemy import create_engine
from flask.ext.httpauth import HTTPBasicAuth
from flask.ext.cors import CORS

conn_string = "mssql+pyodbc://x"
e = create_engine(conn_string)

auth = HTTPBasicAuth()

@auth.get_password
def get_password(username):
    if username == 'x':
        return 'x'
    return None

app = Flask(__name__)
cors = CORS(app)
api = Api(app)

class Report(Resource):
    decorators = [auth.login_required]

    def get(self):
        parser = reqparse.RequestParser()
        parser.add_argument('start', type = str)
        parser.add_argument('end', type = str)
        args = parser.parse_args()

        conn = e.connect()

        stat = """
        select a, b from report where c < ? and d > ?
        """

        query = conn.execute(stat, [args['start'], args['end']])

        json_dict = []

        for i in query.cursor.fetchall():


            res = {'aa': i[0], 'bb':i[1]}
            json_dict.append(res)

        conn.close()
        return jsonify(results=json_dict)

api.add_resource(Report, '/report')

if __name__ == '__main__':
    app.run(host='0.0.0.0')

我尝试调试问题,以下是我的观察结果:
1)Flask API运行在5000端口上,当我psping VM的5000端口时,我能够连接成功,这意味着进程实际上在VM上正常运行。
2)在检查日志时,GET请求甚至没有被API接收到。如果有一些db错误,那么我会得到一个500错误消息,但请求甚至没有到达API的第一个位置。
3)即使我在本地调用API,问题仍然存在。
4)如果我对5000端口(我的flask API运行的端口)进行netstat,我会得到以下结果:

enter image description here

由于某些原因,我认为它没有关闭套接字连接。我收到了很多“CLOSE_WAIT”。这是否是问题的原因?我该如何在我的代码中解决这个问题?

可能是Werkzeug的一个bug。看起来你正在生产环境中使用Flask开发服务器。如果你想要长时间的正常运行,Werkzeug并不够强大。切换到生产服务器(gunicorn、uWSGI)并查看是否有所改善。我相信这样做会给你带来更好的结果。 - Miguel Grinberg
@Miguel,我即使在使用Flask + Gunicorngthread工作器时也遇到了这个问题。 - hafiz031
你好,你最终是怎么解决这个问题的?在我的应用程序中,我使用了FlaskGunicorn(使用gthread工作进程),但是遇到了这个问题。应用程序在某些时候停止接收请求。但是如果我重新启动应用程序,它就会再次开始工作,但是过一段时间后同样的问题又会出现。 - hafiz031
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接