Django: how to pass individual setting to manage.py
-
21-03-2021 - |
Domanda
I'm looking for a way to override/define some individual django setting from command line without additional settings files.
What I need right now is to set the DEBUG setting or logging level each time when I run my management command. But it would be nice to be able to set anything.
Soluzione
Here is my solution. Add the code below to the bottom of your settings file.
# Process --set command line option
import sys
# This module can be imported several times,
# check if the option has been retrieved already.
if not hasattr(sys, 'arg_set'):
# Search for the option.
args = filter(lambda arg: arg[:6] == '--set=', sys.argv[1:])
if len(args) > 0:
expr = args[0][6:]
# Remove the option from argument list, because the actual command
# knows nothing about it.
sys.argv.remove(args[0])
else:
# --set is not provided.
expr = ''
# Save option value for future use.
sys.arg_set = expr
# Execute the option value.
exec sys.arg_set
Then just pass any code to any management command:
./manage.py runserver --set="DEBUG=True ; TEMPLATE_DEBUG=True"
Altri suggerimenti
You can add custom option (ex. log level) to your command. Docs
Example:
from optparse import make_option
class Command(BaseCommand):
option_list = BaseCommand.option_list + (
make_option('--delete',
action='store_true',
dest='delete',
default=False,
help='Delete poll instead of closing it'),
)
# ...
In settings.py you can check for command line arguments, like this:
import sys
# for testing
if "--enable-wiki" in sys.argv:
ENABLE_WIKI = True
sys.argv.remove("--enable-wiki")
Usage:
./manage.py test --enable-wiki MyApp.tests
You can make your settings.py more aware of it's current environment:
DEBUG = socket.gethostname().find( 'example.com' ) == -1
Here's an option for different databases when testing:
'ENGINE': 'sqlite3' if 'test_coverage' in sys.argv else 'django.db.backends.postgresql_psycopg2',
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow