【问题标题】:Flask API not receiving requests all of a suddenFlask API 突然没有收到请求
【发布时间】:2016-03-18 21:22:03
【问题描述】:

我正在尝试在 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 上运行,当我在端口 5000 上对 VM 进行 psping 时,我能够连接,这意味着该进程实际上在 VM 上正常运行。

2) 在检查我的日志时,API 甚至没有收到 GET 请求。如果有一些 db 错误,那么我会收到 500 错误消息,但请求甚至不会首先发送到 API。

3) 如果我在本地调用 API,那么问题仍然存在。

4) 如果我为端口 5000(我的烧瓶 API 正在运行的地方)执行 netstat,我将得到以下信息:

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

【问题讨论】:

  • 可能是 Werkzeug 错误。看来您正在生产中使用 Flask 开发服务器。如果您想要较长的正常运行时间,Werkzeug 不够强大,无法使用。切换到生产服务器(gunicorn,uWSGI),看看这是否会有所改善。很确定这会给你带来更好的结果。
  • 嗨,你最后做了什么来解决这个问题?在我的应用程序中,我使用Flask 和Gunicorn(使用gthread worker),但面临这个问题。应用程序在某个时候停止接收请求。但是,如果我重新启动应用程序,它会再次开始工作,但一段时间后同样的问题会再次出现。

标签: python azure flask sqlalchemy flask-restful


【解决方案1】:

通常,当你得到很多 CLOSE_WAIT 状态时,这意味着有未关闭的套接字连接。而且您似乎在 Flask / Werkzeug - sockets stuck in CLOSE_WAIT 找到了答案,它利用 Tornado http://flask.pocoo.org/docs/0.10/deploying/wsgi-standalone/#tornado 来构建一个非阻塞 Web 服务器。

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2023-03-14
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多