FastAPI utility to implement class-based routing with controllers and dependency injection.
Project description
Welcome to FastAPI Control 👋
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)
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
- Website: leynier.dev
- LinkedIn: @leynier
- Github: @leynier
- Twitter: @leynier41
🤝 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!
Project details
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
File details
Details for the file fastapi-control-0.3.1.tar.gz
.
File metadata
- Download URL: fastapi-control-0.3.1.tar.gz
- Upload date:
- Size: 8.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.13 CPython/3.10.4 Windows/10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7521f08c4af02793bf6d6d6b28bb209de1c1a7a239b30de4ac02a787a8657ac7 |
|
MD5 | 26b96378ef1c7a1c8f40b9a6abaf9f34 |
|
BLAKE2b-256 | 8d8eb90765d25b2d5e74b004e0fe51c559d35a476c95506b8191f2a94c498b2c |
File details
Details for the file fastapi_control-0.3.1-py3-none-any.whl
.
File metadata
- Download URL: fastapi_control-0.3.1-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.13 CPython/3.10.4 Windows/10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8f975b9aa93ba85c78c7ac280c2fbf3691103dbbc44dfc6705484dbdafed0e07 |
|
MD5 | 733c634ad0547e3c82ab8d1b4d156a20 |
|
BLAKE2b-256 | 277ee3bb90757a5903f952f3ae00877e422a6bbccbe57a7931388826117dc0f5 |