Example of using exceptions schema generator for FastAPI.
from abc import abstractproperty
from typing import Optional
from fastapi import FastAPI
from fastapi_errors.exceptions import DefaultHTTPException, BaseHTTPException
from fastapi_errors.generator import generate_examples, ExamplesGenerator
from starlette.responses import JSONResponse
app = FastAPI()
class NotAuthorized(DefaultHTTPException):
error = "UNAUTHORIZED"
status_code = 401
message = "Not authorized."
field = None
class StaffOnly(DefaultHTTPException):
error = "STAFF_ONLY"
status_code = 401
message = "Staff only."
field = None
@app.get(
"/",
responses=generate_examples(
NotAuthorized
)
)
async def get():
pass
class CustomException(BaseHTTPException):
"""Custom class for all HTTP exceptions."""
error: str = abstractproperty()
message: str = abstractproperty()
field: Optional[str] = abstractproperty()
item_id: int = abstractproperty()
def __init__(
self,
item_id: Optional[int] = None,
message: Optional[str] = None,
field: Optional[str] = None
) -> None:
"""Initialize the exception."""
self.message = message if message else self.message
self.field = field if field else self.field
self.item_id = item_id
super().__init__()
def example(self) -> dict:
"""Return an example of the error response. This is used in the OpenAPI docs."""
# create details
details = {
"field": "string",
"message": self.message,
"item_id": self.item_id,
}
# create example
example = {
"summary": self.error,
"value": {
"status": self.status_code,
"error": {"code": self.error, "details": details},
},
}
return example
@app.exception_handler(CustomException)
async def custom_exception_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content={
"status": exc.status_code,
"code": exc.error,
"details": {
"message": str(exc.message),
"field": exc.field,
"item_id": exc.item_id,
},
},
)
class MyException(CustomException):
"""Custom exception class."""
error = "MY_ERROR"
message = "My error message."
item_id = 1
field = None
class CustomExamplesGenerator(ExamplesGenerator):
"""Custom examples generator."""
default_exceptions = (
NotAuthorized,
)
staff = (
StaffOnly,
)
generate_examples = CustomExamplesGenerator.generate_examples
@app.get(
"/{item_id}",
responses=generate_examples(
MyException,
add=["staff"]
)
)
async def get_item(item_id: int):
raise MyException(item_id=item_id, field="burger")
Metadata
Release files for fastapi_errors 0.0.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fastapi_errors-0.0.6.tar.gz | 5.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastapi_errors-0.0.6-py2.py3-none-any.whl | Python 3, Python 2 | none | any | Details |
Total release size: 10.2 kB
Release files / fastapi_errors-0.0.6.tar.gz
| Download URL | fastapi_errors-0.0.6.tar.gz |
|---|---|
| Size | 5.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad29a51e811087eb760a2858b49eefa45a03f2171d8cc608967fe5841e66e794
|
|
BLAKE2b-256 checksum How to use checksums |
97970a51ba60bacdf8dce3239aded45abeaf9ad849a05dad27c337b629d83096
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
python-requests/2.32.3
|
Release files / fastapi_errors-0.0.6-py2.py3-none-any.whl
| Download URL | fastapi_errors-0.0.6-py2.py3-none-any.whl |
|---|---|
| Size | 5.0 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
a7d8ed19da6f4de99b8bc1bc37add8d5f9ab6f9335288938370a49fea86b4631
|
|
BLAKE2b-256 checksum How to use checksums |
1a40573c27e89767c1622f3fe5fa039850572b078846602502fb41a716d68dfb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
python-requests/2.32.3
|