diff options
author | Bryan Newbold <bnewbold@archive.org> | 2021-01-14 19:06:00 -0800 |
---|---|---|
committer | Bryan Newbold <bnewbold@archive.org> | 2021-01-14 19:06:00 -0800 |
commit | 866077830070739191e7e21bc471870efd8bb9bf (patch) | |
tree | 4250dc82e043817a2784d21367bedf6b2aa60579 /fatcat_scholar/web.py | |
parent | 2bf5319193e31b3ccf3e8f467e7ea3e07897a56b (diff) | |
download | fatcat-scholar-866077830070739191e7e21bc471870efd8bb9bf.tar.gz fatcat-scholar-866077830070739191e7e21bc471870efd8bb9bf.zip |
fastapi: add basic error/exception handler and page
Diffstat (limited to 'fatcat_scholar/web.py')
-rw-r--r-- | fatcat_scholar/web.py | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/fatcat_scholar/web.py b/fatcat_scholar/web.py index 6e3524d..05bced1 100644 --- a/fatcat_scholar/web.py +++ b/fatcat_scholar/web.py @@ -10,10 +10,11 @@ from typing import Optional, Any import babel.support from fastapi import FastAPI, APIRouter, Request, Depends, Response from fastapi.staticfiles import StaticFiles -from fastapi.responses import PlainTextResponse +from fastapi.responses import PlainTextResponse, JSONResponse import sentry_sdk from sentry_sdk.integrations.asgi import SentryAsgiMiddleware from starlette_prometheus import metrics, PrometheusMiddleware +from starlette.exceptions import HTTPException as StarletteHTTPException from fatcat_scholar.config import settings, GIT_REVISION from fatcat_scholar.hacks import Jinja2Templates, parse_accept_lang @@ -252,6 +253,34 @@ async def robots_txt(response_class: Any = PlainTextResponse) -> Any: else: return PlainTextResponse(ROBOTS_DISALLOW) +@app.exception_handler(StarletteHTTPException) +async def http_exception_handler(request: Request, exc: StarletteHTTPException) -> Any: + """ + This is the generic handler for things like 404 errors. + """ + # TODO: what if there is an error in any of the detection code? + content = ContentNegotiation(request) + + if content.mimetype == "text/html": + lang = LangPrefix(request) + return i18n_templates[lang.code].TemplateResponse( + "error.html", + { + "request": request, + "locale": lang.code, + "lang_prefix": lang.prefix, + "error": exc, + }, + status_code=exc.status_code, + ) + else: + resp = {'status_code': exc.status_code} + if exc.detail: + resp['detail'] = exc.detail + return JSONResponse( + status_code=exc.status_code, + content=resp, + ) # configure middleware |