Parametrable error names

This commit is contained in:
Gregoo 2025-01-29 22:44:08 +01:00
parent 40142b7e62
commit 8fdeb47c80
2 changed files with 63 additions and 19 deletions

View File

@ -1,7 +1,7 @@
import logging
from sqlite3 import Error, OperationalError
import traceback
from typing import Tuple
from typing import Any, Tuple
from flask import jsonify, redirect, request, render_template, url_for
from werkzeug.wrappers.response import Response
@ -33,12 +33,16 @@ def error(
*,
json: bool = False,
post_redirect: str | None = None,
error_name: str = 'error',
**kwargs,
) -> str | Tuple[str | Response, int] | Response:
# Back to the index if no error (not sure if this can happen)
if error is None:
if json:
return jsonify({'error': 'error() called without an error'})
return json_error(
'error() called without an error',
error_name=error_name
)
else:
return redirect(url_for('index.index'))
@ -56,6 +60,7 @@ def error(
error,
json=json,
post_redirect=post_redirect,
error_name=error_name,
**kwargs
)
@ -71,13 +76,17 @@ def error(
logger.debug(cleaned_exception(error))
if json:
return jsonify({'error': str(error)})
return json_error(
str(error),
error_name=error_name
)
elif post_redirect is not None:
return redirect(url_for(
return redirect_error(
post_redirect,
error=str(error),
error_name=error_name,
**kwargs,
))
)
else:
return render_template(
'error.html',
@ -96,18 +105,20 @@ def error(
line = None
if json:
return jsonify({
'error': 'Exception: {error}'.format(error=str(error)),
'name': type(error).__name__,
'line': line,
'file': file,
}), 500
return json_error(
'Exception: {error}'.format(error=str(error)),
error_name=error_name,
name=type(error).__name__,
line=line,
file=file
), 500
elif post_redirect is not None:
return redirect(url_for(
return redirect_error(
post_redirect,
error=str(error),
error_name=error_name,
**kwargs,
))
)
else:
return render_template(
'exception.html',
@ -125,6 +136,7 @@ def error_404(
*,
json: bool = False,
post_redirect: str | None = None,
error_name: str = 'error',
**kwargs,
) -> Tuple[str | Response, int]:
# Warning
@ -134,14 +146,44 @@ def error_404(
))
if json:
return jsonify({
'error': 'Not found: {error}'.format(error=str(error))
}), 404
return json_error(
'Not found: {error}'.format(error=str(error)),
error_name=error_name
), 404
elif post_redirect is not None:
return redirect(url_for(
return redirect_error(
post_redirect,
error=str(error),
**kwargs
)), 404
error_name=error_name,
**kwargs,
), 404
else:
return render_template('404.html', error=str(error)), 404
# JSON error with parametric error name
def json_error(
error: str,
error_name: str = 'error',
**parameters: Any
) -> Response:
parameters[error_name] = error
return jsonify(parameters)
# Redirect error with parametric error name
def redirect_error(
url: str,
error: str,
error_name: str = 'error',
**kwargs
) -> Response:
error_parameter: dict[str, str] = {}
error_parameter[error_name] = str(error)
return redirect(url_for(
url,
**error_parameter,
**kwargs
))

View File

@ -28,6 +28,7 @@ def exception_handler(
*,
json: bool = False,
post_redirect: str | None = None,
error_name: str = 'error',
**superkwargs,
) -> Callable[[ViewCallable], ViewCallable]:
def outer(function: ViewCallable, /) -> ViewCallable:
@ -42,6 +43,7 @@ def exception_handler(
file,
json=json,
post_redirect=post_redirect,
error_name=error_name,
**kwargs,
**superkwargs,
)