aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2023-06-15 11:07:18 +0300
committerFrederick Muriuki Muriithi2023-06-20 13:36:49 +0300
commita56d857dc1f6dbc25819a4af116139a2f3e14a68 (patch)
treebef21853617bb7b4e10ce8c6fab0e702dd665472
parentb236e6896abdf0e23ff1630e67d0954d1e9ee535 (diff)
downloadgenenetwork2-a56d857dc1f6dbc25819a4af116139a2f3e14a68.tar.gz
Move generic exception handler.
Move the generic exception handler to the `wqflask.app_errors` module and register it with the `register_error_handler` method.
-rw-r--r--wqflask/wqflask/__init__.py5
-rw-r--r--wqflask/wqflask/app_errors.py39
-rw-r--r--wqflask/wqflask/views.py35
3 files changed, 41 insertions, 38 deletions
diff --git a/wqflask/wqflask/__init__.py b/wqflask/wqflask/__init__.py
index 140e94ad..654fe028 100644
--- a/wqflask/wqflask/__init__.py
+++ b/wqflask/wqflask/__init__.py
@@ -6,6 +6,7 @@ from urllib.parse import urljoin, urlparse
import redis
import jinja2
+import werkzeug
from flask_session import Session
from authlib.integrations.requests_client import OAuth2Session
from flask import g, Flask, flash, session, url_for, redirect, current_app
@@ -79,7 +80,9 @@ app.register_blueprint(jobs_bp, url_prefix="/jobs")
app.register_blueprint(oauth2, url_prefix="/oauth2")
from wqflask.decorators import AuthorisationError
-from wqflask.app_errors import handle_authorisation_error
+from wqflask.app_errors import (
+ handle_generic_exceptions, handle_authorisation_error)
+app.register_error_handler(Exception, handle_generic_exceptions)
app.register_error_handler(AuthorisationError, handle_authorisation_error)
server_session = Session(app)
diff --git a/wqflask/wqflask/app_errors.py b/wqflask/wqflask/app_errors.py
index 18b29841..c24fc9be 100644
--- a/wqflask/wqflask/app_errors.py
+++ b/wqflask/wqflask/app_errors.py
@@ -1,11 +1,46 @@
"""Handle errors at the application's top-level"""
+import datetime
+import traceback
-from flask import current_app, render_template
+import werkzeug
+from flask import request, render_template, current_app as app
from wqflask.decorators import AuthorisationError
+def handle_generic_exceptions(exc):
+ err_msg = str(exc)
+ now = datetime.datetime.utcnow()
+ time_str = now.strftime('%l:%M%p UTC %b %d, %Y')
+ # get the stack trace and send it to the logger
+ exc_type, exc_value, exc_traceback = sys.exc_info()
+ formatted_lines = (f"{request.url} ({time_str}) \n"
+ f"{traceback.format_exc()}")
+ _message_templates = {
+ werkzeug.exceptions.NotFound: (
+ f"404: Not Found: {time_str}: {request.url}"),
+ werkzeug.exceptions.BadRequest: (
+ f"400: Bad Request: {time_str}: {request.url}"),
+ werkzeug.exceptions.RequestTimeout: (
+ f"408: Request Timeout: {time_str}: {request.url}")
+ }
+ # Default to the lengthy stack trace!
+ app.logger.error(_message_templates.get(exc_type, formatted_lines))
+ # Handle random animations
+ # Use a cookie to have one animation on refresh
+ animation = request.cookies.get(err_msg[:32])
+ if not animation:
+ animation = random.choice([fn for fn in os.listdir(
+ "./wqflask/static/gif/error") if fn.endswith(".gif")])
+
+ resp = make_response(render_template("error.html", message=err_msg,
+ stack={formatted_lines},
+ error_image=animation,
+ version=app.config["GN_VERSION"]))
+ resp.set_cookie(err_msg[:32], animation)
+ return resp
+
def handle_authorisation_error(exc: AuthorisationError):
"""Handle AuthorisationError if not handled anywhere else."""
- current_app.logger.error(exc)
+ app.logger.error(exc)
return render_template(
"authorisation_error.html", error_type=type(exc).__name__, error=exc)
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index e7a32d34..7cbcb3b8 100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -108,41 +108,6 @@ from wqflask.oauth2.checks import user_logged_in
Redis = get_redis_conn()
-@app.errorhandler(Exception)
-def handle_generic_exceptions(e):
- import werkzeug
- err_msg = str(e)
- now = datetime.datetime.utcnow()
- time_str = now.strftime('%l:%M%p UTC %b %d, %Y')
- # get the stack trace and send it to the logger
- exc_type, exc_value, exc_traceback = sys.exc_info()
- formatted_lines = (f"{request.url} ({time_str}) \n"
- f"{traceback.format_exc()}")
- _message_templates = {
- werkzeug.exceptions.NotFound: ("404: Not Found: "
- f"{time_str}: {request.url}"),
- werkzeug.exceptions.BadRequest: ("400: Bad Request: "
- f"{time_str}: {request.url}"),
- werkzeug.exceptions.RequestTimeout: ("408: Request Timeout: "
- f"{time_str}: {request.url}")}
- # Default to the lengthy stack trace!
- app.logger.error(_message_templates.get(exc_type,
- formatted_lines))
- # Handle random animations
- # Use a cookie to have one animation on refresh
- animation = request.cookies.get(err_msg[:32])
- if not animation:
- animation = random.choice([fn for fn in os.listdir(
- "./wqflask/static/gif/error") if fn.endswith(".gif")])
-
- resp = make_response(render_template("error.html", message=err_msg,
- stack={formatted_lines},
- error_image=animation,
- version=GN_VERSION))
- resp.set_cookie(err_msg[:32], animation)
- return resp
-
-
@app.route("/authentication_needed")
def no_access_page():
return render_template("new_security/not_authenticated.html")