python - 仅在本地查询 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% 的情况下,这对我来说毫无意义。
解决方案
推荐阅读
- ios - 渐变没有填充 UITableViewCell
- amazon-web-services - 如何在 AWS beanstalk 中自定义 nginx 配置?
- reactjs - 反应:无法在 github 上部署我的项目
- pytorch - 将一维向量输入 Pytorch CNN
- .net - 如何防止 vb.net 应用程序滞后
- javascript - 试图将导航器道具传递给孙子时,获取“未定义不是对象”
- visual-studio-code - 当您点击重新聚焦窗口时,您可以阻止 VS Code 移动光标吗?
- java - 部署适配器时出现内容丢失错误“JAXRSApplicationClass”?
- java - Spark-线程 java.lang.NoSuchMethodError 中的异常
- java - 子类化时Java泛型不兼容的类型