OWASP Security Bot - Fast API
Project description
OSBot-Fast-API
A Type-Safe wrapper around FastAPI that provides strong typing, comprehensive middleware support, HTTP event tracking, and seamless AWS Lambda integration through Mangum.
โจ Key Features
- ๐ Type-Safe First: Automatic bidirectional conversion between Type_Safe classes and Pydantic BaseModels
- ๐ก๏ธ Built-in Middleware: API key validation, CORS, disconnect detection, and HTTP event tracking
- ๐ HTTP Event System: Comprehensive request/response tracking with configurable storage
- ๐ AWS Lambda Ready: Direct integration with Mangum for serverless deployment
- ๐งช Testing Utilities: Built-in test server with Type-Safe support
- ๐ Auto-conversion: Seamless Type_Safe โ BaseModel โ Dataclass conversions
- ๐ Route Organization: Clean route structure with automatic path generation
๐ฆ Installation
pip install osbot-fast-api
๐ Quick Start
Basic Application
from osbot_fast_api.api.Fast_API import Fast_API
from osbot_fast_api.api.routes.Fast_API__Routes import Fast_API__Routes
from osbot_utils.type_safe.Type_Safe import Type_Safe
# Define Type-Safe schema
class User(Type_Safe):
username: str
email: str
age: int
# Create routes
class Routes_Users(Fast_API__Routes):
tag = 'users'
def create_user(self, user: User):
# user is automatically converted from BaseModel to Type_Safe
return {'created': user.username}
def get_user__id(self, id: str): # Becomes /users/get-user/{id}
return {'user_id': id}
def setup_routes(self):
self.add_route_post(self.create_user)
self.add_route_get(self.get_user__id)
# Setup application
fast_api = Fast_API(enable_cors=True)
fast_api.setup()
fast_api.add_routes(Routes_Users)
# Get FastAPI app instance
app = fast_api.app()
With Middleware & Authentication
import os
# Configure API key authentication
os.environ['FAST_API__AUTH__API_KEY__NAME'] = 'X-API-Key'
os.environ['FAST_API__AUTH__API_KEY__VALUE'] = 'your-secret-key'
# Create app with middleware
fast_api = Fast_API(
enable_cors=True, # Enable CORS support
enable_api_key=True, # Enable API key validation
default_routes=True # Add /status, /version routes
)
# Configure HTTP event tracking
fast_api.http_events.max_requests_logged = 100
fast_api.http_events.clean_data = True # Sanitize sensitive headers
fast_api.setup()
๐๏ธ Architecture
OSBot-Fast-API extends FastAPI with a comprehensive Type-Safe layer and monitoring capabilities:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Your Application โ
โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ Type-Safe โ โ Routes โ โ Events โ โ
โ โ Schemas โ โ Classes โ โ Handlers โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ OSBot-Fast-API โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Type Conversion System โ โ
โ โ Type_Safe โ BaseModel โ Dataclass โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Middleware Pipeline โ โ
โ โ Disconnect โ Events โ CORS โ API Key โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ HTTP Event Tracking System โ โ
โ โ Request/Response/Traces/Monitoring โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ FastAPI โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ Type-Safe Integration
OSBot-Fast-API automatically converts between Type_Safe classes and Pydantic BaseModels:
from osbot_utils.type_safe.Type_Safe import Type_Safe
from typing import List, Optional
# Define Type-Safe schemas (not Pydantic!)
class Address(Type_Safe):
street: str
city: str
country: str
class Person(Type_Safe):
name: str
age: int
email: Optional[str] = None
addresses: List[Address] = []
# Use directly in routes - automatic conversion happens
class Routes_People(Fast_API__Routes):
tag = 'people'
def create_person(self, person: Person):
# person is Type_Safe instance, not BaseModel
# Full type validation and conversion handled automatically
return person # Automatically converted back to JSON
def setup_routes(self):
self.add_route_post(self.create_person)
๐ HTTP Event Tracking
Built-in comprehensive request/response tracking:
# Configure event tracking
fast_api.http_events.max_requests_logged = 100
fast_api.http_events.clean_data = True # Sanitize sensitive data
fast_api.http_events.trace_calls = True # Enable execution tracing (debug)
# Add event callbacks
def on_request(event):
print(f"Request: {event.http_event_request.path}")
def on_response(response, event):
print(f"Response: {event.http_event_response.status_code}")
print(f"Duration: {event.http_event_request.duration}s")
fast_api.http_events.callback_on_request = on_request
fast_api.http_events.callback_on_response = on_response
๐ก๏ธ Middleware Stack
Built-in middleware pipeline (in execution order):
- Detect_Disconnect: Monitor client disconnections
- Http_Request: Event tracking and logging
- CORS: Cross-origin resource sharing
- API_Key_Check: Header/cookie API key validation
Custom Middleware
class Custom_Fast_API(Fast_API):
def setup_middlewares(self):
super().setup_middlewares() # Add default middleware
@self.app().middleware("http")
async def add_process_time(request: Request, call_next):
import time
start = time.time()
response = await call_next(request)
response.headers["X-Process-Time"] = str(time.time() - start)
return response
๐งช Testing
Built-in test server with Type-Safe support:
from osbot_fast_api.utils.Fast_API_Server import Fast_API_Server
def test_api():
fast_api = Fast_API()
fast_api.setup()
fast_api.add_routes(Routes_Users)
with Fast_API_Server(app=fast_api.app()) as server:
# Test with Type-Safe object
user_data = {'username': 'alice', 'email': 'alice@example.com', 'age': 30}
response = server.requests_post('/users/create-user', data=user_data)
assert response.status_code == 200
assert response.json()['created'] == 'alice'
๐ AWS Lambda Deployment
from mangum import Mangum
from osbot_fast_api.api.Fast_API import Fast_API
# Create and setup application
fast_api = Fast_API()
fast_api.setup()
fast_api.add_routes(Routes_Users)
# Create Lambda handler
app = fast_api.app()
handler = Mangum(app)
def lambda_handler(event, context):
return handler(event, context)
๐ Project Structure
osbot_fast_api/
โโโ api/
โ โโโ Fast_API.py # Main FastAPI wrapper
โ โโโ Fast_API__Routes.py # Route organization base class
โ โโโ Fast_API__Http_Event*.py # Event tracking components
โ โโโ middlewares/ # Built-in middleware
โโโ utils/
โ โโโ type_safe/ # Type conversion system
โ โ โโโ Type_Safe__To__BaseModel.py
โ โ โโโ BaseModel__To__Type_Safe.py
โ โ โโโ ...
โ โโโ Fast_API_Server.py # Test server
โ โโโ Fast_API_Utils.py # Utilities
โโโ examples/ # Usage examples
๐ Documentation
Comprehensive documentation is available in the /docs folder:
- ๐ Main Documentation
- ๐๏ธ Architecture Overview
- ๐ Type-Safe Integration
- ๐ HTTP Events System
- ๐ก๏ธ Middleware Stack
- ๐ Quick Start Guide
- ๐ค LLM Prompts
- ๐งช Testing Guide
๐ฏ Key Benefits
For Developers
- Type Safety: Catch errors at development time with Type_Safe validation
- Less Boilerplate: Convention over configuration approach
- Auto-conversion: Seamless type conversions at API boundaries
- Built-in Testing: Integrated test server and utilities
For Production
- Monitoring: Comprehensive HTTP event tracking
- Security: Built-in API key validation and header sanitization
- Performance: Cached type conversions and efficient middleware
- AWS Ready: Direct Lambda integration with Mangum
For Teams
- Organized Code: Clear separation with Fast_API__Routes classes
- Consistent Patterns: Standardized route naming and structure
- Easy Testing: Type-Safe test utilities
- Documentation: Auto-generated OpenAPI/Swagger docs
๐ง Advanced Features
Route Path Generation
get_users()โ/get-usersget_user__id()โ/get-user/{id}user__id_posts__post_id()โ/user/{id}/posts/{post_id}
Type-Safe Primitives
from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
class Email(Type_Safe__Primitive, str):
def __new__(cls, value):
if '@' not in value:
raise ValueError("Invalid email")
return super().__new__(cls, value)
Event Access in Routes
from fastapi import Request
def get_request_info(self, request: Request):
return {
'event_id': str(request.state.request_id),
'thread_id': request.state.request_data.http_event_info.thread_id
}
๐ค Contributing
Contributions are welcome! Please check the documentation for architecture details and patterns.
๐ License
This project is licensed under the Apache 2.0 License.
๐ Related Projects
- OSBot-Utils - Core Type-Safe implementation
- OSBot-AWS - AWS utilities
- OSBot-Fast-API-Serverless - Serverless extensions
๐ก Examples
For more examples, see:
Built with โค๏ธ using Type-Safe principles for robust, maintainable APIs
Project details
Release history Release notifications | RSS feed
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 osbot_fast_api-0.36.0.tar.gz.
File metadata
- Download URL: osbot_fast_api-0.36.0.tar.gz
- Upload date:
- Size: 809.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
30863ae3a648cc069bde41d03542d30f81f960114b57c58b158743422c328b1c
|
|
| MD5 |
a225793e8312874f497999caec703690
|
|
| BLAKE2b-256 |
f6fc6d3cdc95515acab90f69ea01d111f10fc02d422382b5e47352b2178f15ae
|
File details
Details for the file osbot_fast_api-0.36.0-py3-none-any.whl.
File metadata
- Download URL: osbot_fast_api-0.36.0-py3-none-any.whl
- Upload date:
- Size: 849.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70759e968925515ec562ebf6b372fa192b4bfe1b06810272922175b50cc875e9
|
|
| MD5 |
cc77f0a4ef7777db35511a55fa7c9b46
|
|
| BLAKE2b-256 |
95fb5af3cead194b62641662fbf8da0d8703681d06ea6a02c238e0878fa9e037
|