FastAPI support for RFC9457 problems.
Project description
FastAPI Problems v0.7.1
fastapi_problem
is a set of exceptions and handlers for use in starlette/fastapi
applications to support easy error management and responses
Each exception easily marshals to JSON based on the RFC9457 spec for use in api errors.
Errors
The base fastapi_problem.error.HttpException
accepts a title
, details
, status
(default 500) and optional **kwargs
. An additional code
can be passed in,
which will be used as the type
, if not provided the type
is derived from
the class name.
And will return a JSON response with exc.status
as the status code and response body:
{
"type": "an-exception",
"title": "title",
"details": "details",
"status": 500,
"extra-key": "extra-value",
...
}
Derived types are generated using the class name after dropping ...Error
from
the end, and converting to kebab-case
. i.e. PascalCaseError
will derive the
type pascal-case
. If the class name doesn't suit your purposes, an optional
code
attribute can be set with the desired value of there response type
field.
Some convenience Exceptions are provided with predefined status
attributes.
To create custom errors subclasss these and define the title
attribute.
fastapi_problem.error.ServerException
provides status 500 errorsfastapi_problem.error.BadRequestException
provides status 400 errorsfastapi_problem.error.UnauthorisedException
provides status 401 errorsfastapi_problem.error.NotFoundException
provides status 404 errors
Custom Errors
Subclassing the convenience classes provide a simple way to consistently raise the same error with details/extras changing based on the raised context.
from fastapi_problem.error import NotFoundException
class UserNotFoundError(NotFoundException):
title = "User not found."
raise UserNotFoundError(details="details")
{
"type": "user-not-found",
"title": "User not found",
"details": "details",
"status": 404,
}
Whereas a defined code
will be used in the output.
class UserNotFoundError(NotFoundException):
title = "User not found."
code = "cant-find-user"
raise UserNotFoundError(details="details")
{
"type": "cant-find-user",
"title": "User not found",
"details": "details",
"status": 404,
}
If additional kwargs are provided when the error is raised, they will be included in the output (ensure the provided values are json seriablizable.
raise UserNotFoundError(details="details", user_id="1234", metadata={"hello": "world"})
{
...
"details": "details",
"user_id": "1234",
"metadata": {"hello": "world"},
}
Starlette
import starlette.applications
import fastapi_problem.handler.starlette
app = starlette.applications.Starlette()
fastapi_problem.handler.starlette.add_exception_handler(app)
A custom logger can be provided to add_exception_handler(app, logger=...)
.
If you require cors headers, you can pass a fastapi_problem.cors.CorsConfiguration
instance to add_exception_handler(cors=...)
.
add_exception_handler(
app,
cors=CorsConfiguration(
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
allow_credentials=True,
)
)
To handle unexpected errors provide unhandled_wrappers
, a dict mapping http
status code to HttpCodeException
, the system key default
is also accepted
as the root wrapper for all unhandled exceptions.
If you wish to hide debug messaging from external users, strip_debug=True
will log the debug message and remove it from the response.
from fastapi_problem.error import HttpCodeException
class NotFoundError(HttpCodeException):
status = 404
message = "Endpoint not found."
fastapi_problem.handler.starlette.add_exception_handler(
app,
unhandled_wrappers={
"404": NotFoundError,
},
)
FastAPI
The FastAPI handler is identical to the starlette handler with the additional
handling of RequestValidationError
.
import fastapi
import fastapi_problem.handler.fastapi
app = fastapi.FastAPI()
fastapi_problem.handler.fastapi.add_exception_handler(app)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for fastapi_problem-0.7.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e2411b67f283d675af195cd339812b1c6102a64578a5871136b5cb7322c3fb63 |
|
MD5 | d968db7918e01933873f1502becaa769 |
|
BLAKE2b-256 | 49fd1cfa5cac2fc9b620bd7e3fc41921a03f0acee729115c23935863f048ed0b |