Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
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 production
Django 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.prod

Was this answer clear?