FastAPI plugin to derive route responses based on source code.
Project description
FastAPI Derive Responses Plugin
fastapi-derive-responses is a Python library that extends FastAPI by automatically generating OpenAPI responses based
on your endpoint's source code.
This plugin helps you reduce boilerplate code by deriving response statuses and descriptions directly from your code.
With fastapi-derive-responses you can omit ~5 lines on endpoint definition:
@app.get(
"/add_user",
responses={
- 200: {"description": "User added successfully"},
- 400: {"description": "User already exists"},
- 401: {"description": "Invalid token"},
- 403: {"description": "Only admins and moderators can add users or You are banned"},
- 404: {"description": "Invalid role or User not found"},
},
)
def add_user(
current_user_id: Annotated[int, Depends(auth_user)],
new_user_id: int,
user_role: str
):
if statuses[current_user_id] not in ("admin", "moderator"):
raise HTTPException(403, "Only admins and moderators can add users")
if new_user_id in statuses:
raise HTTPException(400, "User already exists")
if user_role not in ROLES:
raise HTTPException(400, "Invalid role")
statuses[new_user_id] = user_role
return {"message": "User added successfully"}
TODO
-
raise HTTPException(401, detail="Invalid token")in endpoint source ->{401: {description: "Invalid token"}} -
raise HTTPException(404, detail=f"User with id={id} not found")in endpoint source ->{404: {description: "User with id={id} not found"}} -
raise HTTPException(404, headers={"X-Error": "User not found"})in endpoint source ->{404: {headers: {" X-Error": "User not found"}}} - Multiple derived responses for the same endpoint merged into one ->
{401: {description: "Invalid token OR Token is expired"}} - Don't override manually defined responses in decorators
- ^ Same behavior for dependency functions ^
-
:raises HTTPException: 401 Invalid tokenin dependency function docstring parses ->{401: {description: "Invalid token"}} - Avoid false positives (e.g.,
raise HTTPException(401)whereHTTPExceptionis not fromstarletteorfastapi) - Parse custom classes that inherit from
HTTPException - Check for custom response models
- Allow to omit some responses from parsing
- Code analysis for complex structures in detail and headers
Known Issues
Plugin works through AST parsing, so it may not work correctly with complex code structures or runtime generated code.
Also, it may produce false positives: for example, if you raise an exception with name HTTPException from another
module (not from starlette or fastapi) it will be parsed.
Installation
pip install fastapi-derive-responses
Quick Start
Basic Usage
It will propagate {404: {"description": "Item not found"}} to OpenAPI schema.
from fastapi import FastAPI, HTTPException
from fastapi_derive_responses import AutoDeriveResponsesAPIRoute
app = FastAPI()
app.router.route_class = AutoDeriveResponsesAPIRoute
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id == 0:
raise HTTPException(status_code=404, detail="Item not found")
return {"id": item_id, "name": "Item Name"}
Example with Dependencies
It will propagate {401: {"description": "Invalid token"}}, {403: {"description": "You are banned"}} and {404: { "description": "User not found"}} to OpenAPI schema.
from typing import Annotated
from fastapi import Depends, FastAPI
from fastapi_derive_responses import AutoDeriveResponsesAPIRoute
app = FastAPI()
app.router.route_class = AutoDeriveResponsesAPIRoute
def auth_user(token: int) -> int:
"""
Authenticate user
:raises HTTPException: 401 Invalid token
:raises HTTPException: 403 You are banned
:raises HTTPException: 404 User not found
"""
call_some_func_that_may_raise()
return token
@app.get("/users/me")
def get_current_user(user_id: Annotated[int, Depends(auth_user)]):
return {"id": user_id, "role": "admin"}
Also, you can just raise HTTPException in your dependency function:
def auth_user(token: int) -> int:
if token < 100:
raise HTTPException(401, "Invalid token")
user_id = token - 100
if user_id not in statuses:
raise HTTPException(404, "User not found")
if user_id in banlist:
raise HTTPException(403, "You are banned")
return user_id
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_derive_responses-0.1.2.tar.gz.
File metadata
- Download URL: fastapi_derive_responses-0.1.2.tar.gz
- Upload date:
- Size: 4.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.5 Linux/6.10.7-200.fsync.fc40.x86_64
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0e075b3a92790cb6ec61976e2a29e5c0c99b3dded63848ec2b4a990b29aedf6
|
|
| MD5 |
2a62a6e1052b4217a8f314e2b334955a
|
|
| BLAKE2b-256 |
3dffb1aac1a8db7279f867423ae43ad063bf290e17e1d94bc55566baf4f17c33
|
File details
Details for the file fastapi_derive_responses-0.1.2-py3-none-any.whl.
File metadata
- Download URL: fastapi_derive_responses-0.1.2-py3-none-any.whl
- Upload date:
- Size: 5.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.5 Linux/6.10.7-200.fsync.fc40.x86_64
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f577a42a03977a46d1533abdb060d45781ddc9e2a2c90315fe9114bca9e0a98a
|
|
| MD5 |
d2909ffbe1da758c576a3273427294dd
|
|
| BLAKE2b-256 |
daeb70c5cd7f9b694797d7513cb624176694ce026615361de73de794ba482884
|