diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2020-07-28 16:59:32 -0700 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2020-07-28 17:29:44 -0700 |
commit | ab80084f1cd90faf5e069edc4203668c81e75d63 (patch) | |
tree | dd1d4ca21aa805efddd66dd1aa259e5f3b0323d6 | |
parent | 76cec8852f6e431b1c87f7d25f8bd4404f1c67e1 (diff) | |
download | fatcat-ab80084f1cd90faf5e069edc4203668c81e75d63.tar.gz fatcat-ab80084f1cd90faf5e069edc4203668c81e75d63.zip |
generic API error page
This error handler and view page currently works much better than the
"flash()" infrastructure built-in to flask, which uses cookies and
mostly does not work with our views and layouts.
Would like to gradually migrate almost all API errors in the web
interface to just raising errors that get rendered on an error page,
instead of calling `abort(ae.status)`.
-rw-r--r-- | python/fatcat_web/routes.py | 30 | ||||
-rw-r--r-- | python/fatcat_web/templates/api_error.html | 20 |
2 files changed, 50 insertions, 0 deletions
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py index 77b5dc55..a6634292 100644 --- a/python/fatcat_web/routes.py +++ b/python/fatcat_web/routes.py @@ -1005,6 +1005,36 @@ def page_server_error(e): def page_server_down(e): return render_template('503.html'), 503 +@app.errorhandler(ApiException) +def page_fatcat_api_error(ae): + """ + Generic error handler for fatcat API problems. With this error handler, + don't need to explicitly catch API exceptions: they should get caught and + routed correctly here. + """ + if ae.status == 404: + return page_not_found(ae) + elif ae.status in [401, 403]: + return page_not_authorized(ae) + elif ae.status in [405]: + return page_method_not_allowed(ae) + elif ae.status in [409]: + return page_edit_conflict(ae) + try: + json_body = json.loads(ae.body) + ae.error_name = json_body.get('error') + ae.message = json_body.get('message') + except ValueError: + pass + return render_template('api_error.html', api_error=ae), ae.status + +@app.errorhandler(ApiValueError) +def page_fatcat_api_value_error(ae): + ae.status = 400 + ae.error_name = "ValueError" + ae.message = str(ae) + return render_template('api_error.html', api_error=ae), 400 + @app.errorhandler(CSRFError) def page_csrf_error(e): return render_template('csrf_error.html', reason=e.description), 400 diff --git a/python/fatcat_web/templates/api_error.html b/python/fatcat_web/templates/api_error.html new file mode 100644 index 00000000..1a44f610 --- /dev/null +++ b/python/fatcat_web/templates/api_error.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} +{% block body %} + +<center> +<div style="font-size: 8em;">{{ api_error.status or "" }}</div> +<div style="font-size: 3em;">{{ api_error.reason or "" }}</div> +</center> + +<div class="ui icon error message"> + <i class="ban icon"></i> + <div class="content"> + <div class="header"> + API Error: {{ api_error.error_name or "" }} + </div> + <p>{{ api_error.message or "" }} + </div> +</div> + + +{% endblock %} |