Interview question
How do you manage Django settings for different environments (dev, staging, prod)? Django settings को different environments के लिए कैसे manage करते हैं?
Answer
Use environment-specific settings files and environment variables for configuration. Create settings/base.py for common config and settings/dev.py, settings/prod.py for environment-specific overrides. Use python-decouple to load environment variables securely.
// Project Structure
myproject/
├── manage.py
├── .env # Environment variables (gitignored)
├── .env.example # Example (version controlled)
└── myproject/
├── __init__.py
└── settings/
├── __init__.py
├── base.py # Common settings
├── dev.py # Development
├── staging.py # Staging
└── prod.py # Production
// settings/base.py (Common Settings)
from pathlib import Path
import os
from decouple import config
BASE_DIR = Path(__file__).resolve().parent.parent.parent
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='localhost', cast=lambda v: [s.strip() for s in v.split(',')])
// Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': config('DB_NAME'),
'USER': config('DB_USER'),
'PASSWORD': config('DB_PASSWORD'),
'HOST': config('DB_HOST'),
'PORT': config('DB_PORT', default='5432'),
}
}
// Installed Apps
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'myapp',
]
// Middleware
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
]
// Logging
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {'class': 'logging.StreamHandler'},
'file': {'class': 'logging.FileHandler', 'filename': 'debug.log'},
},
'loggers': {'django': {'handlers': ['console'], 'level': 'INFO'}},
}
// settings/dev.py (Development)
from .base import *
DEBUG = True
ALLOWED_HOSTS = ['*']
// SQLite for development
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
// Disable security checks in dev
SECURE_SSL_REDIRECT = False
SESSION_COOKIE_SECURE = False
// Django Debug Toolbar
INSTALLED_APPS += ['debug_toolbar']
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
INTERNAL_IPS = ['127.0.0.1']
// Email backend for testing
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
// settings/prod.py (Production)
from .base import *
DEBUG = False
ALLOWED_HOSTS = config('ALLOWED_HOSTS').split(',')
// Security settings
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'
// Static files with CDN
STATIC_URL = config('STATIC_URL')
STATIC_ROOT = BASE_DIR / 'staticfiles'
STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
// Email backend
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = config('EMAIL_HOST')
EMAIL_PORT = config('EMAIL_PORT', cast=int)
EMAIL_USE_TLS = True
EMAIL_HOST_USER = config('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')
// .env file
SECRET_KEY=your-secret-key-here
DEBUG=False
ALLOWED_HOSTS=example.com,www.example.com
DB_NAME=proddb
DB_USER=dbuser
DB_PASSWORD=securepassword
DB_HOST=prod-db-server.example.com
DB_PORT=5432
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_HOST_USER=your-email@gmail.com
EMAIL_HOST_PASSWORD=app-password
// manage.py modification
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', os.getenv('DJANGO_SETTINGS_MODULE', 'myproject.settings.dev'))
// Run with different settings
python manage.py runserver --settings=myproject.settings.dev
export DJANGO_SETTINGS_MODULE=myproject.settings.prod
python manage.py migrate
// Best Practices
// 1. Keep secrets in environment variables
// 2. Use python-decouple for config
// 3. Never commit .env file
// 4. Provide .env.example
// 5. Use separate settings for each environment
// 6. Document all required environment variables
// 7. Use strong SECRET_KEY in production
// 8. Enable security middleware in productionDjango Settings Management:
Approach:
Base settings + Environment overrides
Files:
- settings/base.py - Common
- settings/dev.py - Development
- settings/prod.py - Production
Environment Variables:
.env file बनाना
secretsecrets store करना
decouple से load करना
Usage:
os.getenv('SECRET_KEY')
config('SECRET_KEY')
Python-decouple:
from decouple import config
DEBUG = config('DEBUG', cast=bool)
PORT = config('PORT', cast=int, default=8000)
Important Variables:
SECRET_KEY - Secret key
DEBUG - Debug mode
ALLOWED_HOSTS - Domain names
DB_* - Database details
EMAIL_* - Email config
Security:
- .env gitignore करो
- .env.example provide करो
- Secrets vault use करो
- Strong KEY in prod
Running:
python manage.py runserver --settings=myproject.settings.dev
export DJANGO_SETTINGS_MODULE=myproject.settings.prodWas this answer clear?