Source code for global_handlers
from uuid import uuid4
from flask import (
current_app,
g,
redirect,
render_template,
request,
session,
url_for,
)
import sqlalchemy as sql
import sqlalchemy.exc as sql_exceptions
from flask_sqlalchemy.record_queries import get_recorded_queries
from db import get_connection, FLASK_DB
from app.model.orm import User
from app.model.lib.errors import LoginRequired
[docs]
def init_global_handlers(app):
app.before_request(_make_session_permanent)
app.before_request(_open_db_connection)
app.before_request(_fetch_user)
app.after_request(_close_db_connection)
app.errorhandler(404)(_render_not_found)
app.errorhandler(sql_exceptions.NoResultFound)(_render_not_found)
app.errorhandler(403)(_render_forbidden)
app.errorhandler(500)(_render_server_error)
app.errorhandler(LoginRequired)(_redirect_to_login)
return app
[docs]
def _open_db_connection():
if request.endpoint == 'static':
return
if 'db_conn' not in g:
g.db_conn = get_connection()
if 'db_session' not in g:
g.db_session = FLASK_DB.session
[docs]
def _fetch_user():
if request.endpoint == 'static':
return
if 'user' not in g:
if 'user_uuid' in session:
user_uuid = session['user_uuid']
else:
# Create a new user UUID so we can keep track of this browser
user_uuid = str(uuid4())
session['user_uuid'] = user_uuid
g.current_user = g.db_session.scalars(
sql.select(User)
.where(User.uuid == user_uuid)
.limit(1)
).one_or_none()
[docs]
def _close_db_connection(response):
if request.endpoint == 'static':
return response
if current_app.config['SQLALCHEMY_RECORD_QUERIES']:
recorded_queries = list(get_recorded_queries())
for query_info in recorded_queries:
duration_ms = round((query_info.end_time - query_info.start_time) * 1_000, 2)
current_app.logger.info(f"[SQL {duration_ms}ms] " + query_info.statement)
current_app.logger.info(f"SQL query count: {len(recorded_queries)}")
db_conn = g.pop('db_conn', None)
if db_conn is not None:
db_conn.close()
return response