Merge branch 'feature/error_pages' into 'master'

Improved webservice error handling

See merge request cara/cara!157
This commit is contained in:
Nicola Tarocco 2021-04-06 10:16:16 +00:00
commit ce6b4a4420
3 changed files with 48 additions and 1 deletions

View file

@ -66,10 +66,20 @@ http {
return 302 /auth/login; return 302 /auth/login;
} }
location @proxy_404_error_handler {
# Pass the request on to the webservice. Most likely the URI won't
# exist so we get a 404 from that service instead (good as the 404
# pages are consistent).
proxy_pass http://cara-webservice:8080/$request_uri;
}
location /voila-server/ { location /voila-server/ {
proxy_intercept_errors on;
# Anything under voila-server or expert-app is authenticated. # Anything under voila-server or expert-app is authenticated.
auth_request /auth/probe; auth_request /auth/probe;
error_page 401 = @error401; error_page 401 = @error401;
error_page 404 = @proxy_404_error_handler;
# cara-app is the name of the voila server in each of docker-compose, # cara-app is the name of the voila server in each of docker-compose,
# test-cara.web.cern.ch and cara.web.cern.ch. # test-cara.web.cern.ch and cara.web.cern.ch.

2
app.sh
View file

@ -1,6 +1,6 @@
if [[ "$APP_NAME" == "cara-webservice" ]]; then if [[ "$APP_NAME" == "cara-webservice" ]]; then
echo "Starting the cara webservice" echo "Starting the cara webservice"
python -m cara.apps.calculator python -m cara.apps.calculator --no-debug
elif [[ "$APP_NAME" == "cara-voila" ]]; then elif [[ "$APP_NAME" == "cara-voila" ]]; then
echo "Starting the voila service" echo "Starting the voila service"
voila app/ --port=8080 --no-browser --base_url=/voila-server/ --Voila.tornado_settings="{'allow_origin': '*'}" voila app/ --port=8080 --no-browser --base_url=/voila-server/ --Voila.tornado_settings="{'allow_origin': '*'}"

View file

@ -1,7 +1,10 @@
import datetime
import html import html
import json import json
import os import os
from pathlib import Path from pathlib import Path
import traceback
import uuid
import jinja2 import jinja2
from tornado.web import Application, RequestHandler, StaticFileHandler from tornado.web import Application, RequestHandler, StaticFileHandler
@ -38,6 +41,39 @@ class BaseRequestHandler(RequestHandler):
else: else:
self.current_user = AnonymousUser() self.current_user = AnonymousUser()
def write_error(self, status_code: int, **kwargs) -> None:
template = self.settings["template_environment"].get_template(
"page.html.j2")
error_id = uuid.uuid4()
contents = (
f'Unfortunately an error occurred when processing your request. '
f'Please let us know about this issue with as much detail as possible at '
f'<a href="mailto:CARA-dev@cern.ch">CARA-dev@cern.ch</a>, reporting status '
f'code {status_code}, the error id of "{error_id}" and the time of the '
f'request ({datetime.datetime.utcnow()}).<br><br><br><br>'
)
# Print the error to the log (and not to the browser!)
if "exc_info" in kwargs:
print(f"ERROR UUID {error_id}")
print(traceback.format_exc())
self.finish(template.render(
user=self.current_user,
contents=contents
))
class Missing404Handler(BaseRequestHandler):
async def prepare(self):
await super().prepare()
self.set_status(404)
template = self.settings["template_environment"].get_template(
"page.html.j2")
self.finish(template.render(
user=self.current_user,
contents='Unfortunately the page you were looking for does not exist.<br><br><br><br>'
))
class ConcentrationModel(BaseRequestHandler): class ConcentrationModel(BaseRequestHandler):
def post(self): def post(self):
@ -128,6 +164,7 @@ def make_app(debug=False, prefix='/calculator'):
urls, urls,
debug=debug, debug=debug,
template_environment=template_environment, template_environment=template_environment,
default_handler_class=Missing404Handler,
xsrf_cookies=True, xsrf_cookies=True,
# COOKIE_SECRET being undefined will result in no login information being # COOKIE_SECRET being undefined will result in no login information being
# presented to the user. # presented to the user.