#python #postgresql #heroku #psycopg2
Вопрос:
У меня есть приложение, созданное с помощью Flask amp; Plotly Dash — своего рода мэшап, позволяющий подписываться на панель мониторинга через PayPal.
Я не могу воспроизвести ошибку в разработке, но иногда я получаю ошибку в журналах Heroku, когда кто-то регистрируется, но не может пройти процесс подписки PayPal. Один человек упомянул, что загрузка PayPal находится в бесконечном цикле, но в остальном неясно, в чем проблема.
Ошибка в журналах такова, но ссылка мне не помогает:
output_value = func(*args, **kwargs) # %% callback invoked %% File "/app/index.py", line 347, in successful conn.execute(upd) File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1263, in execute return meth(self, multiparams, params, _EMPTY_EXECUTION_OPTS) File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection return connection._execute_clauseelement( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1452, in _execute_clauseelement ret = self._execute_context( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1814, in _execute_context self._handle_dbapi_exception( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1995, in _handle_dbapi_exception util.raise_( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 207, in raise_ raise exception File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1771, in _execute_context self.dialect.do_execute( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 717, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected [SQL: UPDATE users SET subscribed=%(subscribed)s WHERE users.id = %(id_1)s] [parameters: {'subscribed': 0, 'id_1': '11'}] (Background on this error at: https://sqlalche.me/e/14/e3q8)
строка 347 в успешном из index.py ссылается на следующий код. Строка 347-это конн.выполнить в 3-м последнем операторе else в коде.
@app.callback( Output('url_login', 'pathname') , [Input('login-button', 'n_clicks')] , [State('uname-box', 'value') , State('pwd-box', 'value')]) def successful(n_clicks, username, password): conn = psycopg2.connect( dbname=dbname, user=dbuser, password=dbpassword, host=dbhost, port=dbport, sslmode=os.environ['sslmode'] ) c = conn.cursor() if paypalenv == "Live": environment = LiveEnvironment(client_id=client_id, client_secret=client_secret) else: environment = SandboxEnvironment(client_id=client_id, client_secret=client_secret) client = PayPalHttpClient(environment) user = Users.query.filter_by(username=username).first() if user: if check_password_hash(user.password, password): login_user(user) cuid = current_user.get_id() c.execute(f"select orderid from users where id = {cuid}") oid = c.fetchone() c.execute(f"select status from users where id = {cuid}") status = c.fetchone() if oid[0] is not None: act = SubscriptionActivate(oid[0]) try: response = client.execute(act) except: response = None if response is not None: if response.result.status == 'ACTIVE': upd = update(Users).where(Users.id == cuid).values(subscribed=1, status= 'ACTIVE') conn = engine.connect() conn.execute(upd) conn.close() else: upd = update(Users).where(Users.id == cuid).values(subscribed=0) conn = engine.connect() conn.execute(upd) conn.close() return '/subscribe' else: upd = update(Users).where(Users.id == cuid).values(subscribed=0) conn = engine.connect() conn.execute(upd) conn.close() return '/subscribe' else: pass else: pass
Ценю любую помощь, не могу найти никаких ответов на этот вопрос и не знаю, как проверить / воспроизвести проблему!
Комментарии:
1. Это ошибка сокета. Не слишком ли долго выполняется запрос? Это может быть тайм-аут.
2. Почти уверен , что вы хотите
conn.commit()
, чтобы после каждого оператора DDL и доconn.close()
, но я не говорю, что это причина ошибки.3. @Selcuk Я признаю, что не знаю. Возможно, это тайм-аут, если человек / paypal занимает слишком много времени? Есть идеи, как это исправить?
4. @mechanical_meat я попробую, но точно так же не уверен, что это поможет! после
conn.execute(upd)
очереди?5. Да, точно сразу после этой строки. Идея заключается в том, что вы фиксируете это изменение в базе данных. Я не уверен, есть ли параметр автоматической фиксации где-либо в коде подключения SQLAlchemy, так что это может что-то сделать, а может и не сделать.