Simplifies class-based views for more organized and maintainable code in FastAPI.
Project description
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 📦
You should create a virtual environment and activate it:
python -m venv venv/
source venv/bin/activate
And then install the development dependencies:
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 pip install -r requirements/all.txt
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.
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_class-3.6.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7349376e9c88534ca8a4b8bec5d9af57e2985d0552595b955536ced904d8a6cc |
|
MD5 | 9a67efaf52e8eddd8d5148f0b87709fc |
|
BLAKE2b-256 | 94798bfb7e8087053e2eecb41a1cf8e93d6cb87ee634c48ca9eec0879c5e72f7 |