Skip to main content

Class

Classes and Decorators to use FastAPI with Class based routing

Continuous Integration Package version Supported Python versions Test


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)

Source distribution for fastapi-class 3.7.0
File Size Uploaded
fastapi_class-3.7.0.tar.gz 55.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fastapi-class 3.7.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

3.7.0 This release

2 release files

3.6.0

2 release files

3.5.0

2 release files

3.4.0

2 release files

3.3.0

2 release files

3.2.0

2 release files

3.1.0

2 release files

2.0.0

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page