PKvv]Hppsample/__init__.py def main(): """Entry point for the application script""" print("Call your main application code here") PKoz]He> #django_generate_secret_key/tests.pyfrom django.test import TestCase from django.core.management import call_command from django.utils.six import StringIO import shutil import os from generate_secret_key.management.commands.generate_secret_key import Command class ImportCsvCommandTests(TestCase): command_name = 'generate_secret_key' BASE_DIR = '/tmp/django_generate_secret_key_tests/' def setUp(self): self.out = StringIO() self.err = StringIO() # Monkey patch to test dissociate from the real directory / secret key Command.BASE_DIR = self.BASE_DIR # Try to remove the directory try: shutil.rmtree(self.BASE_DIR) except FileNotFoundError: pass # Create it os.mkdir(self.BASE_DIR) def tearDown(self): shutil.rmtree(self.BASE_DIR) def test_create_simple(self): call_command(self.command_name, stdout=self.out, stderr=self.err) self._check_valid_key() def test_error_on_too_much_params(self): call_command( self.command_name, "f1", "f2", "f3", stdout=self.out, stderr=self.err ) self.assertEqual( self.err.getvalue(), "Please provide only one file name (or none).\n", ) def test_existing_key(self): call_command(self.command_name, stdout=self.out, stderr=self.err) self.assertEqual(self.err.getvalue(), "",) call_command(self.command_name, stdout=self.out, stderr=self.err) self.assertEqual( self.err.getvalue(), "There is already a secret key in `secretkey.txt`\n", ) def test_replacing_key(self): call_command(self.command_name, stdout=self.out, stderr=self.err) previous_key = self._read_key() call_command(self.command_name, replace=True, stdout=self.out, stderr=self.err) new_key = self._read_key() self.assertNotEqual( previous_key, new_key, ) self.assertEqual(self.err.getvalue(), "",) def test_alternative_name(self): filename = "altsecretkey.txt" call_command( self.command_name, filename, stdout=self.out, stderr=self.err ) self._check_valid_key(filename) self.assertTrue(os.path.isfile(self.BASE_DIR + filename)) self.assertFalse(os.path.isfile(self.BASE_DIR + "secretkey.txt")) def _check_valid_key(self, filename='secretkey.txt'): """ Checks if the key is created and valid """ key = self._read_key(filename) self.assertEqual(len(key), 50) def _read_key(self, filename='secretkey.txt'): """ Reads and return the given key """ try: keyfile = open(self.BASE_DIR + filename) except FileNotFoundError: self.fail("The file `{}` wasn't created".format(filename)) return keyfile.read() PKoz]H&django_generate_secret_key/__init__.pyPKoz]H1django_generate_secret_key/management/__init__.pyPKoz]H:django_generate_secret_key/management/commands/_private.pyPKoz]H:django_generate_secret_key/management/commands/__init__.pyPKoz]HrEdjango_generate_secret_key/management/commands/generate_secret_key.pyfrom optparse import make_option from django.core.management.base import BaseCommand import os import string class Command(BaseCommand): """ Generate a Django secret key in `secretkey.txt` if none exists """ args = 'secretkey.txt' help = 'Generate a Django secret key' can_import_settings = False leave_locale_alone = True # Where to create the key if no parameter is given # This will be monkey-patched when runnning the tests BASE_DIR = os.getcwd() option_list = BaseCommand.option_list + ( make_option('--replace', action='store_true', dest='replace', default=False, help='Replace the existing key'), ) def handle(self, *args, **options): if len(args) > 1: self.stderr.write("Please provide only one file name (or none).") return key_filename = args[0] if args else 'secretkey.txt' key_filepath = os.path.join(self.BASE_DIR, key_filename) try: existing_key = open(key_filepath).read().strip() # Key not empty ? if existing_key and not options['replace']: self.stderr.write("There is already a secret key in `{}`".format(key_filename)) return except IOError: # No key found pass import random generated_key = ''.join([random.SystemRandom().choice(string.ascii_letters + string.digits + string.punctuation) for _ in range(50)]) secret = open(key_filepath, 'w') secret.write(generated_key) secret.close() PK=]H *:django_generate_secret_key-1.0.0.dist-info/DESCRIPTION.rstDjango generate-secret-key application ====================================== Simple Django application that adds a new command: python manage.py generate_secret_key [--replace] [secretkey.txt] This will generate a new file `secretkey.txt` containing a random Django secret key. In your production settings file, replace the hardcoded key by: # Use a separate file for the secret key with open('/path/to/the/secretkey.txt') as f: SECRET_KEY = f.read().strip() You can avoid hardcoding the path of the key by using: import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # Use a separate file for the secret key with open(os.path.join(BASE_DIR, 'secretkey.txt')) as f: SECRET_KEY = f.read().strip() PK=]H˨O8django_generate_secret_key-1.0.0.dist-info/metadata.json{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "Topic :: Software Development :: Build Tools", "Framework :: Django", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5"], "extensions": {"python.details": {"contacts": [{"email": "suixo@securem.eu", "name": "Micka\u00ebl Bergem", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/MickaelBergem/django-generate-secret-key"}}}, "extras": ["dev", "test"], "generator": "bdist_wheel (0.26.0)", "keywords": ["django", "deployment", "secret", "key", "generation"], "license": "MIT", "metadata_version": "2.0", "name": "django-generate-secret-key", "run_requires": [{"requires": ["django"]}], "summary": "A Django application with a command to generate a Django secret key", "version": "1.0.0"}PK=]H8django_generate_secret_key-1.0.0.dist-info/top_level.txtdjango_generate_secret_key PK=]H}\\0django_generate_secret_key-1.0.0.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.26.0) Root-Is-Purelib: true Tag: py3-none-any PK=]H<#3django_generate_secret_key-1.0.0.dist-info/METADATAMetadata-Version: 2.0 Name: django-generate-secret-key Version: 1.0.0 Summary: A Django application with a command to generate a Django secret key Home-page: https://github.com/MickaelBergem/django-generate-secret-key Author: Mickaël Bergem Author-email: suixo@securem.eu License: MIT Keywords: django deployment secret key generation Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: Topic :: Software Development :: Build Tools Classifier: Framework :: Django Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Requires-Dist: django Provides-Extra: dev Provides-Extra: test Django generate-secret-key application ====================================== Simple Django application that adds a new command: python manage.py generate_secret_key [--replace] [secretkey.txt] This will generate a new file `secretkey.txt` containing a random Django secret key. In your production settings file, replace the hardcoded key by: # Use a separate file for the secret key with open('/path/to/the/secretkey.txt') as f: SECRET_KEY = f.read().strip() You can avoid hardcoding the path of the key by using: import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # Use a separate file for the secret key with open(os.path.join(BASE_DIR, 'secretkey.txt')) as f: SECRET_KEY = f.read().strip() PK=]HȲ\--1django_generate_secret_key-1.0.0.dist-info/RECORDdjango_generate_secret_key/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 django_generate_secret_key/tests.py,sha256=skN1lftrB5d7CJ7DZwSwYhsAFzkWEJGi-QR1SWri_F8,2955 django_generate_secret_key/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 django_generate_secret_key/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 django_generate_secret_key/management/commands/_private.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 django_generate_secret_key/management/commands/generate_secret_key.py,sha256=dXA18rkxbasIxRuEP9qDCJQowVsSelT7im7LDiOd5tI,1679 django_generate_secret_key-1.0.0.dist-info/DESCRIPTION.rst,sha256=_bwsCqlOVArk0scu4Vdlbon68b0oxjNEPOxoo2hjeJ0,760 django_generate_secret_key-1.0.0.dist-info/METADATA,sha256=_xQ_L66uH0ygrDJVOkEghkqS6fOmgmTbS2R6e3A1cW4,1671 django_generate_secret_key-1.0.0.dist-info/RECORD,, django_generate_secret_key-1.0.0.dist-info/WHEEL,sha256=zX7PHtH_7K-lEzyK75et0UBa3Bj8egCBMXe1M4gc6SU,92 django_generate_secret_key-1.0.0.dist-info/metadata.json,sha256=84i0ZKo2fXfrczHqUijxnaKmNAJbQ-Ob4HysUobREIM,1055 django_generate_secret_key-1.0.0.dist-info/top_level.txt,sha256=JDkR1gtA0CgRPoVPtY5s3p2_qkUMvb242TJ6Wta9Ij4,27 sample/__init__.py,sha256=awvrxda4UmMqBv2yIsWjcvBwBMM7YROwWnuZ6w-7gjI,112 PKvv]Hppsample/__init__.pyPKoz]He> #django_generate_secret_key/tests.pyPKoz]H&l django_generate_secret_key/__init__.pyPKoz]H1 django_generate_secret_key/management/__init__.pyPKoz]H: django_generate_secret_key/management/commands/_private.pyPKoz]H:W django_generate_secret_key/management/commands/__init__.pyPKoz]HrE django_generate_secret_key/management/commands/generate_secret_key.pyPK=]H *:django_generate_secret_key-1.0.0.dist-info/DESCRIPTION.rstPK=]H˨O8django_generate_secret_key-1.0.0.dist-info/metadata.jsonPK=]H8fdjango_generate_secret_key-1.0.0.dist-info/top_level.txtPK=]H}\\0django_generate_secret_key-1.0.0.dist-info/WHEELPK=]H<#3django_generate_secret_key-1.0.0.dist-info/METADATAPK=]HȲ\--1Y$django_generate_secret_key-1.0.0.dist-info/RECORDPK )