From ac2fc923807a855107d495e5bb7fbe7171efe892 Mon Sep 17 00:00:00 2001 From: teddy Date: Fri, 15 Nov 2024 16:02:54 +0000 Subject: [PATCH] Fix: User login on production. --- config.py | 6 ++++++ controllers/__pycache__/user.cpython-312.pyc | Bin 9706 -> 10605 bytes controllers/user.py | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/config.py b/config.py index 99c25b5a..69ed087a 100644 --- a/config.py +++ b/config.py @@ -31,6 +31,12 @@ class Config: # MySQL SQLALCHEMY_DATABASE_URI = os.getenv('SQLALCHEMY_DATABASE_URI') SQLALCHEMY_TRACK_MODIFICATIONS = False + SQLALCHEMY_ENGINE_OPTIONS = { + 'pool_size': 10, + 'pool_recycle': 280, + 'pool_pre_ping': True, + 'pool_timeout': 30, + } # Auth0 SESSION_COOKIE_SECURE = True SESSION_COOKIE_HTTPONLY = True diff --git a/controllers/__pycache__/user.cpython-312.pyc b/controllers/__pycache__/user.cpython-312.pyc index 69b00a52e42874db620e5393121e6d5c326f1460..cd73e808436bcc3b40717977b1376b998b3cf4d6 100644 GIT binary patch delta 1984 zcmaJ?Z%A8L6ukz}9{!9fO_wV(iAs9^7-! zx%YSe-E;1Jzwi6wP|f$%)s+Ol_a=9aeZ1{_O#|&a-|=mc5}C?1YB(E7M6w-;4pVlk z+p^I_)Z{(t_H1XO)8w}xt}D@%?M`%OV~Lo#=2d&L@kE>wfhf(3+yj1zUX&VTpYp__ zu(7g3u02H(eaenw6QvcCvL#zZs7|hz{bRyXLm4bLo+6v32Dl2lWb=ia7HLUU>65oU zLTn;;mXYi(t+(yklv)L6Gpe*cM&-#eXscK@E(ags5`#02Xxs9jFdV(*cul4D60!QZsndWU9s$@;fv{2UwFk8esJ6Ez3C3Ex|LBHuDbhw^LQ^*p0B*= z39fpAH$0)+WjVC!3El97fAKe5Y+vz5KZ~sTqd$70w_IEPTyvw9hk6iQo^(`^bH3q0 z%csMh;eN~27)AbSALV?%4S5g|6&0WxC+I<<^Gi1(0(Rd%V$?n^S%@Pf!m->1W_84-!ZO8vI05;P=Z$WQ`M_B;O(8emr0T17$L>{J`~{ zv+Wg>XIOnOqV(!R#^6aj}R)zk{cW)weIZ z8tpc^i}?aC*^^wkiDd#UbeNqEw0KPub~J%61I**@*X*mnM*{S+1Fdfr6CBR3C#an4 z<%Ayqm;t*uXJ*0Q4v;x{of9+iD$X6`B+bbflBgAUPeLgL&Y4HL(f?-siQz5s9d;YaGL!74Op`(}F!V;LXo22Sd9`Cx}wi z0w-`Xoa6bdnjF>SnUZH7H&(J#M>8}|?y$dt@6e&;b8TVTR;jB$ct~5 z5f(Vdv$;Z`m-D>R4=Z+OHMyWFd*BlkDGnWfh3s1UZra4`;h5u|wVDRjL^cq9s_qu8 jyDJRQ{Q}-Ep`Me-nw2et`%63Z|J>=ooo~YJR_^L=?t7fK6y90?#Kw+eV&WvWQ=A`r?IbuxO&Z#!k&22CP%4Ous_uc!+B^OsyWa3- zO@1zLfZm`&Q}x^{3O)JAkqc5Kgg_ivQI$g_B&13~AR)C<#k_SKWu*P~oA2;RTJ(6_oV2FZ zX=_HEv1Zj-&vw{6W|hYUh(8iTaFBkx&`)8khtzZgzTCX6G-P+h*C z>}kgEO=&;!)1F^?WQTNPjnM=8{Jx&r*V6~|g`Up;BFVsK`@4QQJZKy};JCQeSIl-+ z&%US-F7I`+KfWy&rmx!KP>8S1A5zOl-)sm+0fjk8c?GNwCX?x z^}Ytx4GIj##11~;KMh<8xIX3pe>E^eKIhT+SllI)g@l~lTfE$7L?DL&2>H&r_@nT| zH-c_Q8#-%bn=IS1TNI|z)W;m%p^;ORMUpS<$O&P!mR5JnXf&yc^Q4 zzjHYg3=oCW@e9Ef3?AhV#>YsRzZf4I^il*x3eh!K7wYdkH1VtaPU62!+`9fPx(5(6 zgn0z)0C)vQk$s2YL-+yVJc3tw1lcmej|i%Oq90a~caMPVi~!~rfGq{Dn1OCFc%VY} zM2^rOpkqS74e9Sl;+NA;GNorn=AK2$PyA)L${$a@CyYOwn)AD|QQ;q^CQo$RCnAbI zxF%k1xZzl)R0x-_Vj}8*P&=!_Q)iKPMXzxa%W?FBKN~wZg2t8|3#2U-iG0za;17cRoqZ@5=nY S!h*0Q_biIAoGMQFG4V$!10ePQ diff --git a/controllers/user.py b/controllers/user.py index 489f2b67..9144a3c4 100644 --- a/controllers/user.py +++ b/controllers/user.py @@ -21,6 +21,7 @@ import lib.argument_validation as av # external from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app from flask_sqlalchemy import SQLAlchemy +from sqlalchemy import exc from flask_wtf.csrf import generate_csrf from werkzeug.exceptions import BadRequest from extensions import oauth # db, @@ -34,6 +35,21 @@ db = SQLAlchemy() routes_user = Blueprint('routes_user', __name__) +def handle_db_disconnect(f): + @wraps(f) + def decorated_function(*args, **kwargs): + try: + return f(*args, **kwargs) + except exc.OperationalError as e: + if "MySQL server has gone away" in str(e): + # Close the session and create a new connection + db.session.remove() + db.session.rollback() + # Retry the operation + return f(*args, **kwargs) + raise + return decorated_function + # User authentication @routes_user.route("/login", methods=['POST', 'OPTIONS']) def login(): @@ -109,6 +125,7 @@ def login(): @routes_user.route("/login_callback") # / +@handle_db_disconnect def login_callback(): try: error_state = request.args.get(Model_View_User.FLAG_ERROR_OAUTH) @@ -185,6 +202,7 @@ def logout(): return redirect(url_logout) @routes_user.route("/logout_callback") # / +@handle_db_disconnect def logout_callback(): return redirect(url_for('routes_core.home')) try: