python - 发送并发请求时的InterfaceError(0, '')
问题描述
我正在使用 Flask 和 PyMySQL 构建一个简单的应用程序,以使用 JMeter 进行负载测试以用于学术目的。它已经接收请求并发出响应。但是当我发送多个请求时,它会在几个请求(有时少至一个请求)后喷出下面的错误。
Traceback (most recent call last):
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/username/BossFight/python/helloflask.py", line 82, in get_driver
if (authentication_success(token)):
File "/home/username/BossFight/python/helloflask.py", line 21, in authentication_success
cursor.execute("SELECT COUNT(*) AS matches FROM users WHERE id=%s", (id))
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
result = self._query(query)
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
conn.query(q)
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/pymysql/connections.py", line 515, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "/home/username/BossFight/python/venv/lib/python3.6/site-packages/pymysql/connections.py", line 745, in _execute_command
raise err.InterfaceError("(0, '')")
pymysql.err.InterfaceError: (0, '')
之后,它不再响应 HTTP 500 以外的任何内容,必须重新启动。
以下是源代码的相关部分:
from flask import Flask,jsonify,request
import pymysql.cursors
import bcrypt
import jwt
from pprint import pprint
app = Flask(__name__)
connection = pymysql.connect(
host='localhost',
db='omnibus',
user='starleaf1',
password='alleluia',
cursorclass=pymysql.cursors.DictCursor
)
secret = 'keyboard cat'
def authentication_success(token):
id=jwt.decode(token, secret, algorithms=['HS256'])["id"]
cursor=connection.cursor()
cursor.execute("SELECT COUNT(*) AS matches FROM users WHERE id=%s", (id))
return (cursor.fetchone()['matches'] == 1)
# Other routes goes here....
@app.route('/api/driver/<string:driver_id>', methods=['GET'])
def get_driver(driver_id):
cursor = connection.cursor()
token=request.headers['Authorization'][7:]
if (authentication_success(token)):
cursor.execute(query_get_driver_by_id, (driver_id))
driver=cursor.fetchone()
if (not(driver is None)):
return jsonify(message="ok",driver=driver)
else:
return jsonify(message="not found"),404
else:
return jsonify(message="authentication required"),401
请记住,我是 Python 的初学者。任何帮助,将不胜感激。
解决方案
问题很可能是您具有全局连接。在 Web 应用程序中,每个请求都应该有自己的数据库连接。因此,您的get_driver
函数应该创建一个连接并在完成后关闭该连接(在 finally 子句中)。
所以像:
def create_connection():
return pymysql.connect(
host='localhost',
db='omnibus',
user='starleaf1',
password='alleluia',
cursorclass=pymysql.cursors.DictCursor
)
@app.route('/api/driver/<string:driver_id>', methods=['GET'])
def get_driver(driver_id):
connection = create_connection()
try:
cursor = connection.cursor()
token=request.headers['Authorization'][7:]
if (authentication_success(token)):
cursor.execute("SELECT COUNT(*) AS matches FROM users WHERE id=%s", (driver_id))
driver=cursor.fetchone()
if (not(driver is None)):
return jsonify(message="ok",driver=driver)
else:
return jsonify(message="not found"),404
else:
return jsonify(message="authentication required"),401
finally:
connection.close()
推荐阅读
- c# - 列出位于 C# 中 SFTP 服务器上的 ZIP 文件中的文件
- c# - 在 ng-click 事件 selenium 上获取文件链接
- objective-c - Xcode 12 错误:错误:找不到“SVProgressHUD/SVProgressHUD.h”文件#import
- python - Py-StackExchange API 不返回任何简单查询
- reactjs - 如何在临时抽屉材质 UI 中使用字符串名称指定按钮图标
- java - 有什么方法可以在 Spring 中使用 Swagger 包含控制器中未使用的类?
- c# - 在 ASP.NET Core 3.1 中运行时渲染视图
- javascript - 无法在 Angular 中访问 Promise 中的“this”
- reactjs - 如何在 nextjs 的标记信息窗口中使用链接组件
- javascript - 哪些 babel 设置适合导出库?