Implement template files, create attribute
This commit is contained in:
parent
bd0449632b
commit
21e4b195ea
3 changed files with 40 additions and 12 deletions
36
README.md
36
README.md
|
@ -8,12 +8,16 @@ and storing it outside of your project's settings.py
|
||||||
|
|
||||||
1. In your project's settings.py, import the app like so:
|
1. In your project's settings.py, import the app like so:
|
||||||
|
|
||||||
```from autosecretkey import AutoSecretKey```
|
```python
|
||||||
|
from autosecretkey import AutoSecretKey
|
||||||
|
```
|
||||||
|
|
||||||
2. Still in the settings.py file, replace the existing SECRET_KEY line with
|
2. Still in the settings.py file, replace the existing SECRET_KEY line with
|
||||||
something like this:
|
something like this:
|
||||||
|
|
||||||
```SECRET_KEY = AutoSecretKey(BASE_DIR / "config.ini").secret_key```
|
```python
|
||||||
|
SECRET_KEY = AutoSecretKey(BASE_DIR / "config.ini").secret_key
|
||||||
|
```
|
||||||
|
|
||||||
(N.B.: Of course, this line has to be after the BASE_DIR line.)
|
(N.B.: Of course, this line has to be after the BASE_DIR line.)
|
||||||
|
|
||||||
|
@ -30,14 +34,16 @@ For additional security, you may want to store your secret key in a different
|
||||||
location than your project's base directory. You could, for example, do
|
location than your project's base directory. You could, for example, do
|
||||||
something like this:
|
something like this:
|
||||||
|
|
||||||
```AutoSecretKey("/etc/your_project/configuration")```
|
```python
|
||||||
|
AutoSecretKey("/etc/your_project/config.ini")
|
||||||
|
```
|
||||||
|
|
||||||
You need to manually make sure that the user your Django project runs as has
|
You need to manually make sure that the user your Django project runs as has
|
||||||
the permission to read and write this file. Running something like this as
|
the permission to read and write this file. Running something like this as
|
||||||
root should do the trick in Linux (replacing "djangouser" with the actual user
|
root should do the trick in Linux (replacing "djangouser" with the actual user
|
||||||
name):
|
name):
|
||||||
|
|
||||||
```
|
```bash
|
||||||
mkdir /etc/your_project/
|
mkdir /etc/your_project/
|
||||||
touch /etc/your_project/configuration
|
touch /etc/your_project/configuration
|
||||||
chown djangouser /etc/your_project/configuration
|
chown djangouser /etc/your_project/configuration
|
||||||
|
@ -50,7 +56,7 @@ AutoSecretKey object.
|
||||||
|
|
||||||
This is a simple example you could have in your `settings.py`:
|
This is a simple example you could have in your `settings.py`:
|
||||||
|
|
||||||
```
|
```python
|
||||||
from autosecretkey import AutoSecretKey
|
from autosecretkey import AutoSecretKey
|
||||||
my_config_file = AutoSecretKey(BASE_DIR / "config.ini")
|
my_config_file = AutoSecretKey(BASE_DIR / "config.ini")
|
||||||
SECRET_KEY = my_config_file.secret_key
|
SECRET_KEY = my_config_file.secret_key
|
||||||
|
@ -59,7 +65,7 @@ TIME_ZONE = my_config_file.config["MY_SETTINGS"]["TIME_ZONE"]
|
||||||
|
|
||||||
For reference, the corresponding `config.ini` might look like this:
|
For reference, the corresponding `config.ini` might look like this:
|
||||||
|
|
||||||
```
|
```ini
|
||||||
[AutoSecretKey]
|
[AutoSecretKey]
|
||||||
SecretKey = WellThisIsWhereYouWillFindYourSecretKey
|
SecretKey = WellThisIsWhereYouWillFindYourSecretKey
|
||||||
|
|
||||||
|
@ -67,6 +73,24 @@ SecretKey = WellThisIsWhereYouWillFindYourSecretKey
|
||||||
TIME_ZONE = UTC
|
TIME_ZONE = UTC
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can pass the path to an .ini file to use as a template when first creating
|
||||||
|
the file creating your secret key. This file may contain any additional
|
||||||
|
settings you want to have in your config file, the SecretKey will then be added
|
||||||
|
to that. Note that you must not define a secret key within that template file.
|
||||||
|
|
||||||
|
```python
|
||||||
|
AutoSecretKey("/etc/myproject/config.ini", template=BASE_DIR/"config.dist.ini")
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also set the `create` attribute to `False` if you need to make sure
|
||||||
|
the config file already exists - you may want to use this to make sure that
|
||||||
|
custom settings have already been made. If the file exists but no secret key
|
||||||
|
is defined within it, a new secret key will be added to the file.
|
||||||
|
|
||||||
|
```python
|
||||||
|
AutoSecretKey("config.ini", create=False)
|
||||||
|
```
|
||||||
|
|
||||||
All methods you can use on any other ConfigParser object can be used on that
|
All methods you can use on any other ConfigParser object can be used on that
|
||||||
object as well, of course, like get(), getboolean(), etc. For convenience, you
|
object as well, of course, like get(), getboolean(), etc. For convenience, you
|
||||||
can use the AutoSecretKey object's update() method to re-read the contents of
|
can use the AutoSecretKey object's update() method to re-read the contents of
|
||||||
|
|
|
@ -9,7 +9,7 @@ class AutoSecretKey:
|
||||||
config.write(outfile)
|
config.write(outfile)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def read_config_file(cls, path, create=True):
|
def read_config_file(cls, path, template=None, create=False):
|
||||||
config = configparser.ConfigParser(interpolation=None)
|
config = configparser.ConfigParser(interpolation=None)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -18,6 +18,9 @@ class AutoSecretKey:
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
if not create:
|
if not create:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
if template:
|
||||||
|
config.read(template)
|
||||||
|
|
||||||
cls.write_config_file(path, config)
|
cls.write_config_file(path, config)
|
||||||
|
|
||||||
|
@ -26,8 +29,8 @@ class AutoSecretKey:
|
||||||
def write(self):
|
def write(self):
|
||||||
self.__class__.write_config_file(self.path, self.config)
|
self.__class__.write_config_file(self.path, self.config)
|
||||||
|
|
||||||
def update(self):
|
def update(self, template=None, create=False):
|
||||||
self.config = self.__class__.read_config_file(self.path)
|
self.config = self.__class__.read_config_file(self.path, template, create)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def secret_key(self):
|
def secret_key(self):
|
||||||
|
@ -41,8 +44,8 @@ class AutoSecretKey:
|
||||||
|
|
||||||
return new_key
|
return new_key
|
||||||
|
|
||||||
def __init__(self, path, section="AutoSecretKey", config_key="SecretKey"):
|
def __init__(self, path, section="AutoSecretKey", config_key="SecretKey", template=None, create=True):
|
||||||
self.path = path
|
self.path = path
|
||||||
self.section = section
|
self.section = section
|
||||||
self.config_key = config_key
|
self.config_key = config_key
|
||||||
self.update()
|
self.update(template, create)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[metadata]
|
[metadata]
|
||||||
name = django-autosecretkey
|
name = django-autosecretkey
|
||||||
version = 0.9
|
version = 0.9.1
|
||||||
description = A simple Django app to store secret keys outside of settings.py
|
description = A simple Django app to store secret keys outside of settings.py
|
||||||
long_description = file: README.md
|
long_description = file: README.md
|
||||||
long_description_content_type = text/markdown
|
long_description_content_type = text/markdown
|
||||||
|
@ -22,6 +22,7 @@ classifiers =
|
||||||
Programming Language :: Python :: 3.7
|
Programming Language :: Python :: 3.7
|
||||||
Programming Language :: Python :: 3.8
|
Programming Language :: Python :: 3.8
|
||||||
Programming Language :: Python :: 3.9
|
Programming Language :: Python :: 3.9
|
||||||
|
Programming Language :: Python :: 3.10
|
||||||
Topic :: Internet :: WWW/HTTP
|
Topic :: Internet :: WWW/HTTP
|
||||||
Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue