import logging
|
import os
|
import sys
|
|
import environ
|
from django.core.management.utils import get_random_secret_key
|
|
logger = logging.getLogger(__name__)
|
|
|
def is_collectstatic() -> bool:
|
for arg in sys.argv:
|
if 'collectstatic' in arg:
|
return True
|
|
return False
|
|
|
def generate_secret_key_if_missing(data_dir: str) -> str:
|
env_key = 'SECRET_KEY'
|
env = environ.Env()
|
env_filepath = os.path.join(data_dir, '.env')
|
environ.Env.read_env(env_filepath)
|
|
if existing_secret := env.str(env_key, ''):
|
return existing_secret
|
|
logger.warning(f'Warning: {env_key} not found in environment variables. Will generate a random key.')
|
new_secret = get_random_secret_key()
|
|
if is_collectstatic():
|
logger.info(
|
'Random SECRET_KEY was generated, but it is not being persisted because this is a collectstatic run'
|
)
|
return new_secret
|
|
try:
|
with open(env_filepath, 'a') as f:
|
f.write(f'\n{env_key}={new_secret}\n') # nosec
|
except Exception as e:
|
logger.warning(
|
f'Warning: failed to write {env_key} to .env file: {e}, new key will be regenerated on every '
|
f'server restart. If this key is used for signing, it will invalidate all existing sessions '
|
f'or tokens. Please set {env_key} in your environment variables to avoid this warning.'
|
)
|
|
os.environ[env_key] = new_secret
|
return new_secret
|