Simple Controller implementation for FastAPI
Project description
fastapi-controllers
A simple solution for organizing your FastAPI endpoints
Organize your API endpoints
fastapi-controllers offers a simple solution for organizing your API endpoints by means of a Controller class embracing the concept of class-based views.
Features
- class-based approach to organizing FastAPI endpoints
- class-scoped definition of APIRouter parameters
- instance-scoped definition of FastAPI dependencies
- it integrates seamlessly with the FastAPI framework
- works with both sync and async endpoints
Installation
pip install fastapi-controllers
Minimal working example
import uvicorn
from fastapi import FastAPI, Response, status
from fastapi_controllers import Controller, get
class ExampleController(Controller):
@get("/example", response_class=Response)
async def get_example(self) -> Response:
return Response(status_code=status.HTTP_200_OK)
if __name__ == "__main__":
app = FastAPI()
app.include_router(ExampleController.create_router())
uvicorn.run(app)
FastAPI's APIRouter is created and populated with API routes by the Controller.create_router method and can be incorporated into the application in the usual way via app.include_router.
Seamless integration
The router-related parameters as well as those of HTTP request-specific decorators are expected to be the same as those used by fastapi.APIRouter and fastapi.APIRouter.<request_method>. Validation of the provided parameters is performed during initialization via the inspect module. This ensures compatibility with the FastAPI framework and prevents the introduction of a new, unnecessary naming convention.
Supported HTTP request methods
from fastapi_controllers import delete, get, head, options, patch, post, put, trace
Use class variables to customize your APIRouter
Class variables can be used to set the commonly used APIRouter parameters: prefix, dependencies and tags.
import uvicorn
from fastapi import Depends, FastAPI, Response, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials
from pydantic import BaseModel
from fastapi_controllers import Controller, get, post
security = HTTPBasic()
async def authorized_user(credentials: HTTPBasicCredentials = Depends(security)) -> None:
...
class ExampleRequest(BaseModel):
name: str
class ExampleResponse(BaseModel):
message: str
class ExampleController(Controller):
prefix = "/example"
tags = ["example"]
dependencies = [Depends(authorized_user)]
@get("", response_class=Response)
async def get_example(self) -> Response:
return Response(status_code=status.HTTP_200_OK)
@post("", response_model=ExampleResponse)
async def post_example(self, data: ExampleRequest) -> ExampleResponse:
return ExampleResponse(message=f"Hello, {data.name}!")
if __name__ == "__main__":
app = FastAPI()
app.include_router(ExampleController.create_router())
uvicorn.run(app)
Additional APIRouter parameters
Additional APIRouter parameters can be provided via the __router_params__ class variable in form of a mapping.
import uvicorn
from fastapi import FastAPI, Response, status
from fastapi_controllers import Controller, get
class ExampleController(Controller):
prefix = "/example"
tags = ["example"]
__router_params__ = {"deprecated": True}
@get("", response_class=Response)
async def get_example(self) -> Response:
return Response(status_code=status.HTTP_200_OK)
if __name__ == "__main__":
app = FastAPI()
app.include_router(ExampleController.create_router())
uvicorn.run(app)
Important: Beware of assigning values to the same parameter twice (directly on class-level and through
__router_params__). The values stored in__router_params__have precedence and will override your other settings if a name conflict arises. E.g. the followingControllerwould create anAPIRouterwithprefix=/override,tags=["override"]anddependencies=[Depends(override)]
from fastapi import Depends
from fastapi_controllers import Controller
class ExampleController(Controller):
prefix = "/example"
tags = ["example"]
dependencies = [Depends(example)]
__router_params__ = {
"prefix": "/override",
"tags": ["override"],
"dependencies": [Depends(override)],
}
Instance-scoped dependencies
Instance-scoped attributes can be defined in the __init__ method of the Controller and offer an easy way to access common dependencies for all endpoints.
import json
import uvicorn
from fastapi import Depends, FastAPI, Response, status
from fastapi_controllers import Controller, get
class DbSession:
@property
def status(self) -> str:
return "CONNECTED"
async def get_db_session() -> DbSession:
return DbSession()
class ExampleController(Controller):
prefix = "/example"
def __init__(self, session: DbSession = Depends(get_db_session)) -> None:
self.session = session
@get("", response_class=Response)
async def get_status(self) -> Response:
return Response(
content=json.dumps({"status": f"{self.session.status}"}),
status_code=status.HTTP_200_OK,
media_type="application/json",
)
if __name__ == "__main__":
app = FastAPI()
app.include_router(ExampleController.create_router())
uvicorn.run(app)
uvicorn.run(app)
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_controllers-0.1.0.tar.gz.
File metadata
- Download URL: fastapi_controllers-0.1.0.tar.gz
- Upload date:
- Size: 9.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.10.9 Linux/5.15.0-1031-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2757e0a530fded5912f32fbd69a6a52acf5741d2bde551a425a1eeab773cbb4
|
|
| MD5 |
f464b9f54f5a4defad015e9447ae9101
|
|
| BLAKE2b-256 |
b656817b76e077c6cfcaacbe81be27edc0b401a5c4038a448c3a95d75b9a94d1
|
File details
Details for the file fastapi_controllers-0.1.0-py3-none-any.whl.
File metadata
- Download URL: fastapi_controllers-0.1.0-py3-none-any.whl
- Upload date:
- Size: 6.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.10.9 Linux/5.15.0-1031-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e95ffb0f2298925e3d96df7e4e1468aa295f08add74118aedcee9d2c9da2ae46
|
|
| MD5 |
dfcdd1a00fa087691bd0a5be4de9b830
|
|
| BLAKE2b-256 |
8e89de62b4545cea676ec438f390dc4d3f0ed92474679b216248fcb90ec1e21f
|