Classes and Decorators to use FastAPI with Class based routing
Source Code: https://github.com/yezz123/fastapi-class
Install the project: pip install fastapi-class
As you create more complex FastAPI applications, you may find yourself frequently repeating the same dependencies in multiple related endpoints.
A common question people have as they become more comfortable with FastAPI is how they can reduce the number of times they have to copy/paste the same dependency into related routes.
fastapi_class provides a class-based view decorator @View to help reduce the amount of boilerplate necessary when developing related routes.
Highly inspired by Fastapi-utils, Thanks to @dmontagu for the great work.
- Example:
from fastapi import FastAPI, Query
from pydantic import BaseModel
from fastapi_class import View
app = FastAPI()
class ItemModel(BaseModel):
id: int
name: str
description: str = None
@View(app)
class ItemView:
async def post(self, item: ItemModel):
return item
async def get(self, item_id: int = Query(..., gt=0)):
return {"item_id": item_id}
Response model 📦
Exception in list need to be either function that return fastapi.HTTPException itself. In case of a function it is required to have all of it's arguments to be optional.
from fastapi import FastAPI, HTTPException, status
from fastapi.responses import PlainTextResponse
from pydantic import BaseModel
from fastapi_class import View
app = FastAPI()
NOT_AUTHORIZED = HTTPException(401, "Not authorized.")
NOT_ALLOWED = HTTPException(405, "Method not allowed.")
NOT_FOUND = lambda item_id="item_id": HTTPException(404, f"Item with {item_id} not found.")
class ItemResponse(BaseModel):
field: str | None = None
@View(app)
class MyView:
exceptions = {
"__all__": [NOT_AUTHORIZED],
"put": [NOT_ALLOWED, NOT_FOUND]
}
RESPONSE_MODEL = {
"put": ItemResponse
}
RESPONSE_CLASS = {
"delete": PlainTextResponse
}
async def get(self):
...
async def put(self):
...
async def delete(self):
...
Customized Endpoints
from fastapi import FastAPI, HTTPException
from fastapi.responses import PlainTextResponse
from pydantic import BaseModel
from fastapi_class import View, endpoint
app = FastAPI()
NOT_AUTHORIZED = HTTPException(401, "Not authorized.")
NOT_ALLOWED = HTTPException(405, "Method not allowed.")
NOT_FOUND = lambda item_id="item_id": HTTPException(404, f"Item with {item_id} not found.")
EXCEPTION = HTTPException(400, "Example.")
class UserResponse(BaseModel):
field: str | None = None
@View(app)
class MyView:
exceptions = {
"__all__": [NOT_AUTHORIZED],
"put": [NOT_ALLOWED, NOT_FOUND],
"edit": [EXCEPTION]
}
RESPONSE_MODEL = {
"put": UserResponse,
"edit": UserResponse
}
RESPONSE_CLASS = {
"delete": PlainTextResponse
}
async def get(self):
...
async def put(self):
...
async def delete(self):
...
@endpoint(("PUT"), path="edit")
async def edit(self):
...
Note: The edit() endpoint is decorated with the @endpoint(("PUT",), path="edit") decorator, which specifies that this endpoint should handle PUT requests to the /edit path,
using @endpoint("PUT", path="edit") has the same effect
Development 🚧
Setup environment 📦
Note: You should have uv installed, if not you can install it with:
pip install uv
Then you can install the dependencies with:
# Install dependencies
uv sync --all-extras
Run tests 🌝
You can run all the tests with:
bash scripts/test.sh
Format the code 🍂
Execute the following command to apply pre-commit formatting:
bash scripts/format.sh
Execute the following command to apply mypy type checking:
bash scripts/lint.sh
License
This project is licensed under the terms of the MIT license.
Metadata
Release files for fastapi-class 3.7.0
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_class-3.7.0.tar.gz | 55.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastapi_class-3.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 65.1 kB
Release files / fastapi_class-3.7.0.tar.gz
| Download URL | fastapi_class-3.7.0.tar.gz |
|---|---|
| Size | 55.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0f36cab68c30661008ae8c210e8ba27f78d1df127591fc65c2623c16c28cb3e8
|
|
BLAKE2b-256 checksum How to use checksums |
9a3df3c2bc700a982a9a4cd56fda90c8cb04eabf2218478d24bae6569ff80c42
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.0.1 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 21, 2025.
Transparency logRelease files / fastapi_class-3.7.0-py3-none-any.whl
| Download URL | fastapi_class-3.7.0-py3-none-any.whl |
|---|---|
| Size | 9.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
21f28355d32cdd7de6e4790c49a3cb4c192264e3fb6518b5fe7ec0bc20591c66
|
|
BLAKE2b-256 checksum How to use checksums |
54d75c71e17d05d3f818fa1ed2b6533bb52f825ac925b3f2941bf334a468391e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.0.1 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 21, 2025.
Transparency log