# Django-Environ Configuration Fix ## Summary Fixed the configuration in `config/settings/base.py` to properly use `django-environ` for all environment variables, ensuring consistent and secure environment variable management. ## Issue Identified The `config/settings/base.py` file was using `django-environ` for most configuration, but the Social Media API Configuration section at the bottom was using an undefined `config()` function instead of the proper `env()` object. This would cause a `NameError` when Django tried to read social media API credentials. ## Changes Made ### 1. Fixed Social Media API Configuration (`config/settings/base.py`) **Before:** ```python YOUTUBE_API_KEY = config('YOUTUBE_API_KEY', default=None) GOOGLE_LOCATIONS = config('GOOGLE_LOCATIONS', default=None, cast=lambda v: v.split(',') if v else None) ANALYSIS_BATCH_SIZE = config('ANALYSIS_BATCH_SIZE', default=10, cast=int) ANALYSIS_ENABLED = config('ANALYSIS_ENABLED', default=True, cast=bool) ``` **After:** ```python YOUTUBE_API_KEY = env('YOUTUBE_API_KEY', default=None) GOOGLE_LOCATIONS = env.list('GOOGLE_LOCATIONS', default=[]) ANALYSIS_BATCH_SIZE = env.int('ANALYSIS_BATCH_SIZE', default=10) ANALYSIS_ENABLED = env.bool('ANALYSIS_ENABLED', default=True) ``` ### 2. Updated `.env.example` File Added comprehensive social media API configuration section with all required environment variables: ```bash # Social Media API Configuration # YouTube YOUTUBE_API_KEY=your-youtube-api-key YOUTUBE_CHANNEL_ID=your-channel-id # Facebook FACEBOOK_PAGE_ID=your-facebook-page-id FACEBOOK_ACCESS_TOKEN=your-facebook-access-token # Instagram INSTAGRAM_ACCOUNT_ID=your-instagram-account-id INSTAGRAM_ACCESS_TOKEN=your-instagram-access-token # Twitter/X TWITTER_BEARER_TOKEN=your-twitter-bearer-token TWITTER_USERNAME=your-twitter-username # LinkedIn LINKEDIN_ACCESS_TOKEN=your-linkedin-access-token LINKEDIN_ORGANIZATION_ID=your-linkedin-organization-id # Google Reviews GOOGLE_CREDENTIALS_FILE=client_secret.json GOOGLE_TOKEN_FILE=token.json GOOGLE_LOCATIONS=location1,location2,location3 # OpenRouter AI Configuration OPENROUTER_API_KEY=your-openrouter-api-key OPENROUTER_MODEL=anthropic/claude-3-haiku ANALYSIS_BATCH_SIZE=10 ANALYSIS_ENABLED=True ``` ## Django-Environ Benefits ### Type Conversion `django-environ` provides built-in type conversion methods: - `env('KEY')` - String (default) - `env.int('KEY')` - Integer - `env.bool('KEY')` - Boolean - `env.list('KEY')` - List (comma-separated) - `env.float('KEY')` - Float - `env.dict('KEY')` - Dictionary - `env.db('KEY')` - Database URL parsing - `env.email('KEY')` - Email validation - `env.path('KEY')` - Path object ### Error Handling - Automatic validation of environment variables - Clear error messages for missing or invalid values - Type-safe configuration loading - Default value support for optional variables ### Security - Environment variables loaded from `.env` file (not in version control) - Sensitive credentials never committed to code - Different values for development, staging, and production - `.env.example` shows required variables without exposing values ## Usage Examples ### Basic Usage ```python # Read from environment DEBUG = env('DEBUG', default=False) SECRET_KEY = env('SECRET_KEY') ALLOWED_HOSTS = env('ALLOWED_HOSTS', default=[]) ``` ### Type-Specific Methods ```python # Integer PORT = env.int('PORT', default=8000) # Boolean DEBUG = env.bool('DEBUG', default=False) # List (comma-separated) ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['localhost']) # Database URL DATABASES = { 'default': env.db('DATABASE_URL', default='sqlite:///db.sqlite3') } ``` ### Multiple Environments ```python # Development DEBUG = env.bool('DEBUG', default=True) # Production (in production .env) # DEBUG=False # SECRET_KEY=production-secret-key ``` ## Project Configuration Status ### ✓ Dependencies - `django-environ>=0.11.0` is already in `pyproject.toml` dependencies ### ✓ Configuration Files - `config/settings/base.py` - Updated to use `env()` consistently - `.env.example` - Updated with all social media API variables ### ✓ Environment Variables All environment variables now use `django-environ` methods: - `env()` - String values - `env.bool()` - Boolean values - `env.int()` - Integer values - `env.list()` - List values - `env.db()` - Database URLs (commented out) ## Environment Variable Reference ### Core Django Settings - `SECRET_KEY` - Django secret key - `DEBUG` - Debug mode (bool) - `ALLOWED_HOSTS` - Allowed hosts (list) ### Database - `DATABASE_URL` - PostgreSQL connection string ### Celery - `CELERY_BROKER_URL` - Redis connection string - `CELERY_RESULT_BACKEND` - Redis connection string ### Email - `EMAIL_BACKEND` - Email backend - `EMAIL_HOST` - SMTP server - `EMAIL_PORT` - SMTP port (int) - `EMAIL_USE_TLS` - Use TLS (bool) - `EMAIL_HOST_USER` - SMTP username - `EMAIL_HOST_PASSWORD` - SMTP password - `DEFAULT_FROM_EMAIL` - Default sender email ### Social Media APIs - `YOUTUBE_API_KEY` - YouTube Data API key - `YOUTUBE_CHANNEL_ID` - YouTube channel ID - `FACEBOOK_PAGE_ID` - Facebook page ID - `FACEBOOK_ACCESS_TOKEN` - Facebook access token - `INSTAGRAM_ACCOUNT_ID` - Instagram account ID - `INSTAGRAM_ACCESS_TOKEN` - Instagram access token - `TWITTER_BEARER_TOKEN` - Twitter/X bearer token - `TWITTER_USERNAME` - Twitter username - `LINKEDIN_ACCESS_TOKEN` - LinkedIn access token - `LINKEDIN_ORGANIZATION_ID` - LinkedIn organization ID - `GOOGLE_CREDENTIALS_FILE` - Google credentials file path - `GOOGLE_TOKEN_FILE` - Google token file path - `GOOGLE_LOCATIONS` - Google locations list - `OPENROUTER_API_KEY` - OpenRouter API key - `OPENROUTER_MODEL` - AI model name - `ANALYSIS_BATCH_SIZE` - Batch size for analysis (int) - `ANALYSIS_ENABLED` - Enable analysis (bool) ### Notifications - `SMS_ENABLED` - Enable SMS (bool) - `SMS_PROVIDER` - SMS provider - `WHATSAPP_ENABLED` - Enable WhatsApp (bool) - `WHATSAPP_PROVIDER` - WhatsApp provider - `EMAIL_ENABLED` - Enable email (bool) - `EMAIL_PROVIDER` - Email provider ## Best Practices 1. **Never commit `.env` file** - Add to `.gitignore` 2. **Keep `.env.example` updated** - Document all required variables 3. **Use type-specific methods** - `env.bool()`, `env.int()`, `env.list()` 4. **Provide sensible defaults** - Use `default=` parameter 5. **Validate in production** - Ensure all required variables are set 6. **Document variable formats** - Include examples in `.env.example` 7. **Rotate secrets regularly** - Update keys and tokens periodically ## Testing To verify the configuration works correctly: ```bash # Copy example to .env cp .env.example .env # Edit .env with your values nano .env # Run Django check python manage.py check # Run development server python manage.py runserver ``` ## Troubleshooting ### NameError: name 'config' is not defined **Problem:** Using `config()` instead of `env()` **Solution:** Ensure all environment variables use `env()` method ### ValueError for type conversion **Problem:** Invalid value format for type **Solution:** Check `.env` file values match expected types ### Missing environment variable **Problem:** Required variable not set **Solution:** Add variable to `.env` file or provide default value ## Migration Notes If migrating from existing configuration: 1. Review all `config()` calls in `base.py` 2. Replace with appropriate `env()` methods 3. Update `.env.example` with all variables 4. Test in development environment first 5. Deploy to production after validation ## Related Documentation - [django-environ Documentation](https://django-environ.readthedocs.io/) - [Django Settings](https://docs.djangoproject.com/en/stable/topics/settings/) - [Environment Variables Best Practices](https://12factor.net/config) ## Summary The django-environ configuration has been fixed and is now consistent throughout the project. All environment variables use the proper `env()` methods with type conversion, and the `.env.example` file provides a complete reference for all required configuration variables.