Skip to main content

Welcome to FastAPI Control 👋

CI License: MIT made-with-python PyPI version fury.io PyPI pyversions Last commit GitHub commit activity Github Stars Github Forks Github Watchers GitHub contributors

FastAPI utility to implement class-based routing with controllers and dependency injection.

Install

pip install fastapi-control

Usage

from fastapi import FastAPI
from fastapi_control import (
    APIController,
    add_controller,
    add_controllers,
    controller,
    get,
    inject,
)


# Optionally declares an abstraction
class GreeterAbstraction:
    def greet(self):
        raise NotImplementedError()


# Implement the abstraction and make it available to the injection system
# using the @inject decorator
@inject(alias=GreeterAbstraction)
class GretterImplementation:
    def greet(self):
        return "Hello, world!"


# It is also possible to implement without abstraction and make it available
# to the injection system directly
@inject()
class SpanishGretterImplementation:
    def greet(self):
        return "Hola, mundo!"


@inject()
class NestedGretterImplementation:
    # When the @inject decorator is used, the arguments of the __init__
    # method are automatically injected (if the @inject decorator was used
    # in the argument type declarations)
    def __init__(self, spanish_gretter: SpanishGretterImplementation) -> None:
        self.gretter = spanish_gretter

    def greet(self):
        return self.gretter.greet()


# With the @controller decorator and inheriting from APIController, we can
# declare class-based routing (also called controller) and it has the same
# parameters as FastAPI's APIRouter
@controller(prefix="/home")
class HomeController(APIController):
    # When the @controller decorator is used, the arguments of the __init__
    # method are automatically injected (if the @inject decorator was used
    # in the argument type declarations)
    def __init__(
        self,
        gretter: GreeterAbstraction,
        spanish_gretter: SpanishGretterImplementation,
        nested_gretter: NestedGretterImplementation,
    ) -> None:
        self.gretter = gretter
        self.spanish_gretter = spanish_gretter
        self.nested_gretter = nested_gretter

    # The @get decorator declares the method as a GET endpoint (there are
    # also @post, @put, @delete, @patch decorators) and the behavior is the
    # same as the corresponding FastAPI decorators.
    @get(path="/greet")
    def get_greet(self):
        return self.gretter.greet()

    @get(path="/spanish_greet")
    def get_spanish_greet(self):
        return self.spanish_gretter.greet()

    @get(path="/nested_greet")
    def get_nested_greet(self):
        return self.nested_gretter.greet()


api = FastAPI()
# Finally, it is necessary to add the controllers to the FastAPI instance
add_controllers(api)

# If you want to have multiple FastAPI instances with different controllers,
# you can use the add_controller method to add the desired controllers to
# the desired FastAPI instance one by one.
other_api = FastAPI()
add_controller(other_api, HomeController)

Clearing the controller registry

Every @controller is registered in a global registry used by add_controllers. If you need a clean slate (for example, to isolate tests), use reset_controllers:

from fastapi_control import reset_controllers

reset_controllers()  # the registry is now empty

Requirements

Inspirations

This project is based on and inspired by the NEXTX and FastApi-RESTful projects.

The difference with FastApi-RESTful is that FastAPI Control implements an automatic dependency injection system independent of FastAPI.

The difference with NEXTX is that FastAPI Control only aims to solve the problem of class-based routes and automatic dependency injection, and uses the kink library for dependency injection which is still under maintenance while NEXTX uses python-inject which has not been maintained since 2020.

Many thanks to the creators and maintainers of those projects for providing inspiration and guidance for this one.

Authors

👨🏻‍💻 Leynier Gutiérrez González

🤝 Contributing

Contributions, issues and feature requests are welcome!
Feel free to check issues page. You can also take a look at the contributing guide.

Show your support

Give a ⭐️ if this project helped you!

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_control-0.5.0.tar.gz (8.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastapi_control-0.5.0-py3-none-any.whl (9.9 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_control-0.5.0.tar.gz.

File metadata

  • Download URL: fastapi_control-0.5.0.tar.gz
  • Upload date:
  • Size: 8.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for fastapi_control-0.5.0.tar.gz
Algorithm Hash digest
SHA256 166b196edcbbf59254bc44d4251244543c3208eea1bbd399af4cdc4c0ee44f2a
MD5 c2f1b508c6cbec42877d16695fc9ba34
BLAKE2b-256 57bf5eb68fd7e2e90457142f34a6d9de1df0381c23711f519c062ec8b629b72b

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_control-0.5.0.tar.gz:

Publisher: release.yml on leynier/fastapi-control

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastapi_control-0.5.0-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_control-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0b3b4561c2b2636573b21882e307ead80021551af3386ad68f9431cae41a11d9
MD5 45cb469c64b304592defb94579a3a443
BLAKE2b-256 b7c2403d1c84c4b665433f57e80daee620bcf3a6b5e6313d0022ef49a23f6947

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_control-0.5.0-py3-none-any.whl:

Publisher: release.yml on leynier/fastapi-control

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page