带有mysql和flask-login的Flask-sqlalchemy管道破裂错误32

时间:2019-06-16 23:17:47

标签: python mysql flask flask-sqlalchemy flask-login

在初始页面加载(使用flask-login登录屏幕)上,从mysql到flask-sqlalchemy的管道断开(错误32),第二个请求有效。网站将继续工作数小时,然后再次失败。

通过mysql + pymysql网址进行连接

数据库是Ubuntu 18.04计算机上的本地mysql 5.7服务器 该网站是通过gunicorn托管的

站点正在使用蓝图。

Flask==1.0.2
Flask-SQLAlchemy==2.4.0
Flask-Login==0.4.1

网站的建立依据: https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world

在config.py中     SQLALCHEMY_POOL_RECYCLE = 300

从mysql db

:     wait_timeout = 28800

来自/etc/mysql/mysql.conf.d/mysqld.cnf     max_allowed_pa​​cket = 100M

从这里的其他线程来看,sqlalchemy正在执行会话关闭,因此after_request函数中没有任何内容。

我通过以下搜索进入了Google的第三页:

  • flask-sqlalchemy损坏的管道
  • mysql sqlalchemy损坏的管道
  • 烧瓶登录mysql损坏的管道

    2019-06-15 10:48:43,061错误:/ user / login [POST]上的异常[在/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py:1761中]  11回溯(最近一次通话):  12文件“ /srv/troopnet/venv/lib/python3.6/site-packages/pymysql/connections.py”,第713行,以_write_bytes为单位  13 self._sock.sendall(数据)  14 BrokenPipeError:[Errno 32]管道损坏

简化的站点:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager

db = SQLAlchemy()
login = LoginManager()
login.login_view = 'user.login'

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    db.init_app(app)
    login.init_app(app)

    from app.main import mod_main
    app.register_blueprint(mod_main, url_prefix='/')

    from app.user import mod_user
    app.register_blueprint(mod_user, url_prefix='/user')

我让这个站点在AWS上的16.04 VM上运行了2年,然后我最近迁移到18.04服务器并升级了我所有的flask / python模块。

我还没有遍历每个模块的版本,以确认为什么现在会出现这种现象。

编辑

完整堆栈跟踪(已删除电子邮件地址和哈希,其中“ ABC”和“ XYZ”在此处)

2019-06-15 10:48:43,061 ERROR: Exception on /user/login [POST] [in /srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py:1761]
Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/connections.py", line 713, in _write_bytes
    self._sock.sendall(data)
BrokenPipeError: [Errno 32] Broken pipe

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
    cursor, statement, parameters, context
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
    cursor.execute(statement, parameters)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/connections.py", line 516, in query
    self._execute_command(COMMAND.COM_QUERY, sql)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/connections.py", line 771, in _execute_command
    self._write_bytes(packet)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/connections.py", line 718, in _write_bytes
    "MySQL server has gone away (%r)" % (e,))
pymysql.err.OperationalError: (2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/srv/troopnet/app/user/routes.py", line 519, in login
    user = User().authenticate(form.email.data, form.password.data).first()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3215, in first
    ret = list(self[0:1])
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3007, in __getitem__
    return list(res)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3317, in __iter__
    return self._execute_and_instances(context)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3342, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
    return meth(self, multiparams, params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
    distilled_params,
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context
    e, statement, parameters, cursor, context
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 128, in reraise
    raise value.with_traceback(tb)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
    cursor, statement, parameters, context
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
    cursor.execute(statement, parameters)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/connections.py", line 516, in query
    self._execute_command(COMMAND.COM_QUERY, sql)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/connections.py", line 771, in _execute_command
    self._write_bytes(packet)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/pymysql/connections.py", line 718, in _write_bytes
    "MySQL server has gone away (%r)" % (e,))
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))")
[SQL: SELECT users.id AS users_id, users.email AS users_email, users.password AS users_password 
FROM users 
WHERE users.email = %(email_1)s AND users.password = %(password_1)s 
 LIMIT %(param_1)s]
[parameters: {'email_1': 'ABC', 'password_1': 'XYZ', 'param_1': 1}]
(Background on this error at: http://sqlalche.me/e/e3q8)
2019-06-15 10:48:47,064 ERROR: Exception on /user/login [POST] [in /srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py:1761]
Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1177, in _execute_context
    conn = self._revalidate_connection()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 463, in _revalidate_connection
    "Can't reconnect until invalid "
sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/srv/troopnet/app/user/routes.py", line 519, in login
    user = User().authenticate(form.email.data, form.password.data).first()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3215, in first
    ret = list(self[0:1])
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3007, in __getitem__
    return list(res)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3317, in __iter__
    return self._execute_and_instances(context)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3342, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
    return meth(self, multiparams, params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
    distilled_params,
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
    e, util.text_type(statement), parameters, None, None
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 128, in reraise
    raise value.with_traceback(tb)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1177, in _execute_context
    conn = self._revalidate_connection()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 463, in _revalidate_connection
    "Can't reconnect until invalid "
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back
[SQL: SELECT users.id AS users_id, users.email AS users_email, users.password AS users_password
FROM users 
WHERE users.email = %(email_1)s AND users.password = %(password_1)s 
 LIMIT %(param_1)s]
[parameters: [{}]]
2019-06-15 10:48:50,638 ERROR: Exception on /user/login [POST] [in /srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py:1761]
Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1177, in _execute_context
    conn = self._revalidate_connection()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 463, in _revalidate_connection
    "Can't reconnect until invalid "
sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/srv/troopnet/app/user/routes.py", line 519, in login
    user = User().authenticate(form.email.data, form.password.data).first()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3215, in first
    ret = list(self[0:1])
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3007, in __getitem__
    return list(res)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3317, in __iter__
    return self._execute_and_instances(context)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3342, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
    return meth(self, multiparams, params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
    distilled_params,
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
    e, util.text_type(statement), parameters, None, None
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 128, in reraise
    raise value.with_traceback(tb)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1177, in _execute_context
    conn = self._revalidate_connection()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 463, in _revalidate_connection
    "Can't reconnect until invalid "
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back
[SQL: SELECT users.id AS users_id, users.email AS users_email, users.password AS users_password
FROM users 
WHERE users.email = %(email_1)s AND users.password = %(password_1)s 
 LIMIT %(param_1)s]
[parameters: [{}]]
2019-06-15 10:48:56,354 ERROR: Exception on /user/login [POST] [in /srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py:1761]
Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1177, in _execute_context
    conn = self._revalidate_connection()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 463, in _revalidate_connection
    "Can't reconnect until invalid "
sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/srv/troopnet/app/user/routes.py", line 519, in login
    user = User().authenticate(form.email.data, form.password.data).first()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3215, in first
    ret = list(self[0:1])
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3007, in __getitem__
    return list(res)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3317, in __iter__
    return self._execute_and_instances(context)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3342, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
    return meth(self, multiparams, params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
    distilled_params,
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
    e, util.text_type(statement), parameters, None, None
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 128, in reraise
    raise value.with_traceback(tb)
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1177, in _execute_context
    conn = self._revalidate_connection()
  File "/srv/troopnet/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 463, in _revalidate_connection
    "Can't reconnect until invalid "
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back
[SQL: SELECT users.id AS users_id, users.email AS users_email, users.password AS users_password
FROM users 
WHERE users.email = %(email_1)s AND users.password = %(password_1)s 
 LIMIT %(param_1)s]
[parameters: [{}]]

1 个答案:

答案 0 :(得分:0)

根据您对最近依赖关系升级的评论,我认为问题出在Flask-Login的版本上。

我在不同但相似的Flask构建上使用相同的问题(使用相同的依赖项)。 flask_login版本0.4.1(问题跟踪程序here)如何处理用户会话存在问题。

当我升级到以下版本时,问题消失了:

Flask-Login==0.5.0
Flask==1.1.2

请注意,您可能还需要以下内容(不要安装最新的1.0.1,因为它对我而言不起作用):

Werkzeug==0.16.1

如果以上方法均无济于事,您可能需要浏览以下列表(在我的情况下不起作用):

祝你好运!

相关问题