Configuration
info
Configure Fluvius Framework to match your application's needs.
Basic Configuration
Environment Variables
Create a .env file:
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
# Redis (for workers)
REDIS_URL=redis://localhost:6379/0
# Application
SECRET_KEY=your-secret-key-here
DEBUG=False
LOG_LEVEL=INFO
# Namespace
NAMESPACE=myapp
Settings Class
Create a settings file:
# config/settings.py
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
# Database
database_url: str
redis_url: str = "redis://localhost:6379/0"
# Application
secret_key: str
debug: bool = False
log_level: str = "INFO"
# Namespace
namespace: str = "myapp"
class Config:
env_file = ".env"
env_file_encoding = "utf-8"
settings = Settings()
Domain Configuration
Domain Meta
Configure domain metadata:
from fluvius.domain import Domain
class UserDomain(Domain):
__aggregate__ = UserAggregate
class Meta:
revision = 1
tags = ["user", "identity"]
title = "User Management Domain"
description = "Domain for managing user accounts"
Namespace Configuration
Set namespace for isolation:
from fluvius.domain.context import SanicContext
# Create context with namespace
ctx = SanicContext.create(namespace='app-user')
domain = UserDomain(ctx)
Database Configuration
PostgreSQL
from fluvius.data import PostgreSQLDriver
driver = PostgreSQLDriver(
connection_string="postgresql://user:pass@localhost/db",
pool_size=10,
max_overflow=20
)
MongoDB
from fluvius.data import MongoDBDriver
driver = MongoDBDriver(
connection_string="mongodb://localhost:27017/",
database="mydb"
)
SQLite
from fluvius.data import SQLiteDriver
driver = SQLiteDriver(
database_path=":memory:", # or "path/to/database.db"
check_same_thread=False
)
FastAPI Configuration
Basic App
from fluvius.fastapi import FluviusFastAPI
app = FluviusFastAPI(
title="My API",
version="1.0.0",
description="My Fluvius API"
)
With CORS
from fastapi.middleware.cors import CORSMiddleware
from fluvius.fastapi import FluviusFastAPI
app = FluviusFastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
With Authentication
from fluvius.fastapi import FluviusFastAPI
from fluvius.fastapi.authentication import AuthMiddleware
app = FluviusFastAPI()
app.add_middleware(AuthMiddleware)
Worker Configuration
Basic Worker
from fluvius.worker import Worker
worker = Worker(
redis_url="redis://localhost:6379/0",
max_jobs=10
)
With Settings
from fluvius.worker import Worker
from myapp.config.settings import settings
worker = Worker(
redis_url=settings.redis_url,
max_jobs=settings.max_worker_jobs
)
Logging Configuration
Basic Logging
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
Structured Logging
import logging
import json
class JSONFormatter(logging.Formatter):
def format(self, record):
log_data = {
'timestamp': self.formatTime(record),
'level': record.levelname,
'logger': record.name,
'message': record.getMessage(),
}
if hasattr(record, 'extra'):
log_data.update(record.extra)
return json.dumps(log_data)
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logging.root.addHandler(handler)
logging.root.setLevel(logging.INFO)
Media Configuration
Local Storage
from fluvius.media import MediaManager, LocalStorage
storage = LocalStorage(path="/uploads")
media = MediaManager(storage=storage)
S3 Storage
from fluvius.media import MediaManager, S3Storage
storage = S3Storage(
bucket="my-bucket",
region="us-east-1",
access_key_id="...",
secret_access_key="..."
)
media = MediaManager(storage=storage)
Casbin Configuration
Basic Enforcer
from fluvius.casbin import CasbinEnforcer
enforcer = CasbinEnforcer(
model_path="path/to/model.conf",
policy_path="path/to/policy.csv"
)
With Database Adapter
from fluvius.casbin import CasbinEnforcer
from casbin_sqlalchemy_adapter import Adapter
adapter = Adapter(engine)
enforcer = CasbinEnforcer(
model_path="path/to/model.conf",
adapter=adapter
)
Configuration Files
config.ini
[database]
url = postgresql://user:pass@localhost/db
pool_size = 10
max_overflow = 20
[redis]
url = redis://localhost:6379/0
[application]
secret_key = your-secret-key
debug = False
log_level = INFO
namespace = myapp
pyproject.toml
[tool.fluvius]
namespace = "myapp"
database_url = "postgresql://user:pass@localhost/db"
redis_url = "redis://localhost:6379/0"
[tool.fluvius.logging]
level = "INFO"
format = "json"
Environment-Specific Configuration
Development
# config/development.py
from .settings import Settings
class DevelopmentSettings(Settings):
debug: bool = True
log_level: str = "DEBUG"
database_url: str = "postgresql://localhost/devdb"
Production
# config/production.py
from .settings import Settings
class ProductionSettings(Settings):
debug: bool = False
log_level: str = "WARNING"
database_url: str = os.getenv("DATABASE_URL")
Testing
# config/testing.py
from .settings import Settings
class TestingSettings(Settings):
debug: bool = True
log_level: str = "DEBUG"
database_url: str = "sqlite:///:memory:"
Configuration Best Practices
1. Use Environment Variables
Store secrets in environment variables:
import os
database_url = os.getenv("DATABASE_URL")
secret_key = os.getenv("SECRET_KEY")
2. Validate Configuration
Use Pydantic for validation:
from pydantic import BaseSettings, validator
class Settings(BaseSettings):
database_url: str
@validator('database_url')
def validate_database_url(cls, v):
if not v.startswith(('postgresql://', 'mongodb://', 'sqlite://')):
raise ValueError('Invalid database URL')
return v
3. Use Defaults
Provide sensible defaults:
class Settings(BaseSettings):
log_level: str = "INFO"
debug: bool = False
pool_size: int = 10
4. Separate Secrets
Keep secrets separate:
# .env (gitignored)
SECRET_KEY=actual-secret-key
DATABASE_PASSWORD=actual-password
# .env.example (committed)
SECRET_KEY=your-secret-key-here
DATABASE_PASSWORD=your-password-here
5. Document Configuration
Document all configuration options:
class Settings(BaseSettings):
"""Application settings.
Attributes:
database_url: Database connection string
redis_url: Redis connection string
secret_key: Secret key for encryption
"""
database_url: str
redis_url: str
secret_key: str
Next Steps
- Learn about Core Concepts
- Check Usage Guide
- Explore Examples