使用 Flask 和 MySQL 的 Python 在不活动一段时间后超时

标签 python mysql flask uwsgi

我正在创建一个 REST API。我使用 Python、Flask 和 MySQL 从数据库获取数据并以 JSON 格式呈现它们。但我有一个问题。

REST API 由 NGINX 和 uWSGI 提供,一切运行良好。索引页保持可用并且不会超时,但与数据库建立连接的页面却会超时。页面大约需要 15 分钟才会变得无响应。在 phpmyadmin 或 navicat 等 RDBMS 中不会出现此问题。

这可能是什么以及如何修复它?下面的 REST API 代码。

# using python version 2.7.10
from flask import Flask, jsonify, request, session
import mysql.connector.pooling

#Make a connection with the DB

dbconfig = {
  "host" : "12.34.5.78",
  "database": "db",
  "user":     "user",
  "password": "pass"
}

conn = mysql.connector.connect(pool_name = "mypool",
                          pool_size = 6,
                          **dbconfig)

#Define the root
app = Flask(__name__)

#Landings page
@app.route('/')
def index():
    return "Hello World."

# return all resources by name
@app.route('/resources', methods=['GET'])
def allResourceNames():
    conn1 = mysql.connector.connect(pool_name="mypool")
    reader = conn1.cursor()
    query = ("SELECT name FROM resources")
    reader.execute(query)
    resources = []
    for name in reader:
        resources.append({'name' : name[0]})
    reader.close()
    conn1.close()
    return jsonify({"resources" : resources})

if __name__ == "__main__":
    app.run(debug=True)

最佳答案

以上所有评论都是正确的。以下是如何修改代码以在每次请求后关闭数据库连接。每次调用 get_db 时,它都会创建一个新的数据库连接,并在每次请求后关闭它。

# using python version 2.7.10
import mysql
from flask import Flask, jsonify, request, session, g

def connect_db():
    conn = mysql.connector.connect(user='user', password='pass',
                                   host='12.34.5.67', database='db')
    return conn

def get_db():
    if not hasattr(g, 'db'):
        g.db = connect_db()
    return g.db

#Define the root
app = Flask(__name__)


# close db at end of each request
@app.teardown_appcontext
def close_db(_):
    if hasattr(g, 'db'):
        g.db.close()


#Landings page
@app.route('/')
def index():
    return "Hello World."

# return all resources by name
@app.route('/resources', methods=['GET'])
def allResourceNames():
    reader = get_db()
    query = ("SELECT name FROM resources")
    reader.execute(query)
    resources = []
    for name in reader:
        resources.append({'name' : name[0]})
    return jsonify({"resources" : resources})

if __name__ == "__main__":
    app.run(debug=True)

Link to docs

关于使用 Flask 和 MySQL 的 Python 在不活动一段时间后超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40362439/

相关文章:

python - 为什么 gunicorn 显示这么多进程?

python - 我可以将 Unicode 字符串转储到字节数组吗?

mysql - SQL中IF语句中的WHERE条件

python - Python (Flask) 中的 Get 和 Post 方法

python - MismatchingStateError:mismatching_state:CSRF警告!国家的请求和回应不平等

python - 按当前时间查询(postgres、psycopg2、python)

python - 通过串口从python向Arduino发送数据

python - 使用 py.test 运行测试套件(任意测试集合)

mysql - 如何选择列中具有最大值的行?

mysql - 如何在netezza中制作时间维度?