Changing Django settings at runtime

前端 未结 7 1262
-上瘾入骨i
-上瘾入骨i 2020-11-30 05:09

I\'d like to expose some (app-specific) settings to the admin interface, so users can change them comfortably and also not have to restart Django.

How should I go ab

相关标签:
7条回答
  • 2020-11-30 05:59

    Take a look: https://bitbucket.org/bkroeze/django-livesettings *Django-Livesettings is a project split from the Satchmo Project_. It provides the ability to configure settings via an admin interface, rather than by editing "settings.py".*

    Maybe it can be helpful for you.

    0 讨论(0)
  • 2020-11-30 05:59

    You can use recomended .configure() method of settings module:

    from django.conf import settings
    settings.configure(DEBUG=True)
    

    settings module has additional handy features. Check docs.

    0 讨论(0)
  • 2020-11-30 06:00

    Honestly I get more Django when I analyze his code. In version 1.4.5 did it (following the module below):

    • myproject\manage.py

    • django\core\management__init__.py ## method - execute_manager

    • django\conf__init__.py ## class - LazySettings; attr - _wrapped

    • django\utils\functional.py ## class LazyObject; important method - new_method_proxy

    Functional option, but it has its risks. In the python "_" considers the attribute as protected.

    from django.conf import settings
    
    settings._wrapped.INSTALLED_APPS = () ## *really work*
    

    In the following project: https://github.com/alexsilva/DJPlugins you can see this variable being modified at runtime. the idea of the project is already working.

    0 讨论(0)
  • 2020-11-30 06:01

    From Django 1.8 docs:

    You shouldn’t alter settings in your applications at runtime.

    0 讨论(0)
  • 2020-11-30 06:02

    AFAIK, the Django settings are supposed to be immutable. There are multiple reasons for this, the most obvious being that Django is not aware of the server's execution model (prefork / multi-threaded).

    Also, you can't load the settings themselves from a Django model because the settings need to be loaded before you can use anything in the ORM.

    So, basically, you have two solutions:

    • you can bootstrap the settings from the database by using any lower-level database access mechanism to load them; or
    • you can just define your settings in some other model and fetch them directly when you need them.

    The first is an incredible hack and I don't suggest it. The second is much more direct and cleaner, but requires you to change your usual habits (from django.conf import settings).

    The second approach is probably what's implemented by the 3rd-party apps you linked to.

    0 讨论(0)
  • 2020-11-30 06:07

    You cannot directly modify the settings.py file For example: If u want change the database at runtime, you should Separate the configuration of the database

    # Projecr_name/user_database.py
    user_database = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'name',
        'USER': 'admin',
        'PASSWORD': '111111',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    },
    'user_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'user1',
        'USER': 'admin',
        'PASSWORD': '22222',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
    }
    # Projecr_name/settings.py
    from .user_database import user_database
    ...
    DATABASES = user_database
    ...
    

    Call in your logical view

    # view.py
    from ../Projecr_name/user_database import user_database
    class Some(...):
        def Some(request):
        user_database['user_db']['NAME']='user2'
    

    then you can change any setting at runtime use this way

    0 讨论(0)
提交回复
热议问题