When developing FastAPI applications, it’s essential to manage different configurations for various environments (e.g., development, testing, production). This helps ensure that your application behaves correctly in different contexts and prevents sensitive information from being exposed.
Using Environment Variables
One common approach to managing environment-specific configurations is to use environment variables. You can set environment variables using your operating system’s environment settings or through command-line arguments.
Example:
Bash
# Set environment variables
export DEBUG=True
export DATABASE_URL=postgresql://user:password@host:port/database
Loading Environment Variables in FastAPI
Use the dotenv
library to load environment variables from a .env
file:
Python
from dotenv import load_dotenv
from pathlib import Path
load_dotenv()
Creating a Configuration Model
Define a Pydantic model to represent your application’s configuration:
Python
from pydantic import BaseModel
class Settings(BaseModel):
debug: bool
database_url: str
Accessing Configuration Values
Access configuration values using the Settings
model:
Python
from fastapi import Depends
def get_settings():
settings = Settings()
return settings
@app.get("/")
def read_root(settings: Settings = Depends(get_settings)):
return {"debug": settings.debug, "database_url": settings.database_url}
Conditional Configuration
You can use conditional logic to set different configuration values based on the environment:
Python
import os
def get_settings():
if os.getenv("ENVIRONMENT") == "production":
return Settings(debug=False, database_url="postgresql://prod_user:prod_password@prod_host:prod_port/prod_database")
else:
return Settings(debug=True, database_url="postgresql://dev_user:dev_password@dev_host:dev_port/dev_database")
Using Environment-Specific Configuration Files
Alternatively, you can use separate configuration files for different environments. For example, you could have settings.py
for development and settings_prod.py
for production.
Additional Terms:
- Secret Management: For sensitive information like API keys or database passwords, consider using a secret management service or storing them in environment variables that are not checked into your source code.
- Configuration Validation: Use Pydantic’s validation features to ensure that configuration values are valid and consistent.
- Configuration Management Tools: Explore tools like
python-dotenv
orconfigparser
for more advanced configuration management.