Cet article est repris de l’archive et appartient à l’ancien propriétaire du site, il a été repris sur celui-ci dans une forme d’hommage
On ne veut pas mettre sa SECRET_KEY en prod, et utiliser un service pour générer la clé, ça va deux minutes.
Générer une clé secrète:
import random import string def secret_key(size=50): pool = string.ascii_letters + string.digits + string.punctuation return « ».join(random.SystemRandom().choice(pool) for i in range(size)) |
Générer une clé secrete avec une commande manage.py
:
from django.core.management.base import BaseCommand, CommandError from polls.models import Question as Poll class Command(BaseCommand): help = ‘Generate a secret key’ def add_arguments(self, parser): parser.add_argument(‘size’, default=50, type=int) def handle(self, *args, **options): self.stdout.write(secret_key(options[‘size’])) |
A mettre dans ./votreapp/management/command/generate_secret_key.py
🙂
Une fonction pour lire la clé depuis un fichier texte ou générer la clé si elle n’existe pas:
import io import os try: import pwd except ImportError: pass try: import grp except ImportError: pass def secret_key_from_file( file_path, create=True, size=50, file_perms=None, # unix uniquement file_user=None, # unix uniquement file_group=None # unix uniquement ): try: with io.open(file_path) as f: return f.read().strip() except IOError as e: if e.errno == 2 and create: with io.open(file_path, ‘w’) as f: key = secret_key(size) f.write(key) if any((file_perms, file_user, file_group)) and not pwd: raise ValueError(‘File chmod and chown are for Unix only’) if file_user: os.chown(file_path, uid=pwd.getpwnam(file_user).pw_uid) if file_group: os.chown(file_path, gid=grp.getgrnam(file_group).gr_gid) if file_perms: os.chmod(file_path, int(str(file_perms), 8)) return key raise |
Et une fonction pour récupérer la clé depuis une variable d’environnement ou un fichier:
def get_secret_key( file_path=None, create=True, size=50, file_perms=None, file_user=None, file_group=None, env_var= »DJANGO_SECRET_KEY » ): try: return os.environ[env_var] except KeyError: if file_path: return secret_key_from_file(file_path, create=create, size=size) raise |
Le but de cette dernière est d’avoir ça dans son fichier de settings:
SECRET_KEY = get_secret_key('secret_key')
Et de foutre ‘secret_key’ dans son .gitignore.
Comme ça:
- Si on n’a pas de clé secrète, on en génère une.
- Si on a une, elle est dans un fichier qui n’est PAS dans settings.py.
- On peut commiter settings.py. Chaque env de dev et prod a sa clé secrète automatiquement.
- On peut overrider la clé avec une variable d’environnement si on le souhaite.