首页 > 解决方案 > 仅在本地查询 Flask 端点时有时会出现错误

问题描述

几个月前,我开发了一个应用程序,它使用 MS SQL Server 2019 进行数据存储,并使用 Flask API 从 Web 应用程序中查询数据。这在 Ubuntu 服务器上运行了几个月,没有出现错误。

从那时起,服务器被关闭,我在我的 Windows 10 机器上本地设置项目以进行演示。从我的 Web 应用程序随机查询 Flask API 时,我现在遇到了未指定的错误。有时请求顺利通过,有时 Flask 应用程序会抛出错误。值得注意的是,在使用 Postman 进行测试或在 SQL Server 上手动执行查询时,我没有遇到错误。仅在从 Web 应用程序执行此操作时才会发生。

ERROR:app:Exception on /my-endpoint [GET]
Traceback (most recent call last):
  File "D:\Project\ProjectRestApi\venv\lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "D:\Project\ProjectRestApi\venv\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "D:\Project\ProjectRestApi\venv\lib\site-packages\flask_cors\extension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "D:\Project\ProjectRestApi\venv\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "D:\Project\ProjectRestApi\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "D:\Project\ProjectRestApi\venv\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "D:\Project\ProjectRestApi\venv\lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "D:\Project\ProjectRestApi\venv\lib\site-packages\flask_cors\decorator.py", line 128, in wrapped_function
    resp = make_response(f(*args, **kwargs))
  File "d:/Project/ProjectRestApi/app.py", line 186, in get_my_endpoint
    cursor.execute(query)
pyodbc.Error: ('HY000', 'The driver did not supply an error!')

有时我还会收到以下错误消息:

pyodbc.Error: ('HY010', '[HY010] [Microsoft][ODBC Driver Manager] Function sequence error (0) (SQLRowCount)')

Python 代码应该无关紧要,因为它是一个简单的 SQL SELECT 查询并且已经工作了几个月,并且仅在从 Web 应用程序查询时抛出此错误。这也发生在几个端点上,都抛出相同的错误。为了完整起见,这是引发错误的端点之一:

@app.route('/my-endpoint', methods=['GET'])
@cross_origin()
def get_my_endpoint():
    min_date = request.args.get('min_date')
    max_date = request.args.get('max_date')
    query = "SELECT * FROM mytable"
    if min_date is None and max_date is None:
        query += ";"
    elif min_date is None:
        query += " WHERE dataday <= '{0}';".format(max_date)
    elif max_date is None:
        query += " WHERE dataday >= '{0}';".format(min_date)
    else:
        query += " WHERE dataday >= '{0}' AND dataday <= '{1}';".format(min_date, max_date)

    cursor.execute(query)
    rows = cursor.fetchall()
    data = []
    for row in rows:
        data.append(MyTable(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]))
    return jsonify(data)

在最初的 Ubuntu 服务器上,我使用 Gunicorn 在 API 和 Nginx 服务器之间进行通信。现在在 Windows 上,我只是运行 Python 脚本。我在尝试从本地 Web 应用程序查询 API 时也收到了 CORS 错误,我使用flask_cors解决了这个错误。

app = Flask(__name__)
app.json_encoder = MyJSONEncoder
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'

database = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=' + cfg.db['server'] + ';DATABASE=' +
                          cfg.db['database'] + ';UID=' + cfg.db['username'] + ';PWD=' + cfg.db['password'] +
                          ";MultipleActiveResultSets=True" +
                          (";Trusted_Connection=Yes" if os.name == 'nt' else ""), autocommit=True)
database.setencoding(encoding='utf-8')
cursor = database.cursor()

来自 web 应用程序的请求是通过 axios 发出的:

let response = await axios.get("http://localhost:5000/my-endpoint");

我认为这一定是我在 Windows 上本地而不是远程 Linux 服务器上运行设置的问题,因为它在那里工作得非常好。不幸的是,这个错误没有给我任何信息,而且只发生在 50% 的情况下,这对我来说毫无意义。

标签: pythonsql-serverapiflask

解决方案


推荐阅读