Site original : Sam & Max: Python, Django, Git et du cul
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:
En attendant, j’ai proposé qu’on ajoute ça a django extensions. Et qui sait, dans le core peut être un jour ?