我想将一些(特定于应用程序的)设置公开给管理界面,这样用户可以轻松地更改它们,也不必重新启动Django。
我应该怎么做?
我检查了http://djangopackages.com/grids/g/live-setting/上的应用程序(btw django-constance是最吸引人的)但实际上所有这些应用程序正在做的是将值存储在数据库中,提供用于更改它们的Web界面和缓存。 Django中已经内置了前两个功能吗?
我看到的最大缺点是没有任何应用程序是这些设置的旧位置(settings.py)的替代品,并且要求我迁移到他们的表示法,并且经常添加另一个上下文处理器来访问它们在模板中。
我不能这样做吗?
从我目前的天真观点来看,我看到的唯一缺点是:
这不是两个世界中最好的 - 运行时管理员(及其所有额外津贴),数据库后端,缓存以及我的所有设置.USED_TO_BE_IN_SETTINGS_DOT_PY需要进行任何更改。我错过了什么吗?
答案 0 :(得分:17)
AFAIK,Django设置应该是不可变的。这有多种原因,最明显的是Django不知道服务器的执行模型(prefork / multi-threaded)。
此外,您无法从Django模型加载设置本身,因为在您可以使用ORM中的任何内容之前需要加载设置。
所以,基本上,你有两个解决方案:
第一个是令人难以置信的黑客,我不建议。第二种更直接,更清洁,但要求你改变习惯(from django.conf import settings
)。
第二种方法可能是您链接到的第三方应用程序所实现的。
答案 1 :(得分:9)
来自Django 1.8文档:
You shouldn’t alter settings in your applications at runtime.
答案 2 :(得分:6)
DATABASES
是一个词典。所以你可以操纵字典:
import django.conf as conf
conf.settings.DATABASES['default']['NAME'] = 'novo_banco'
答案 3 :(得分:2)
看看:https://bitbucket.org/bkroeze/django-livesettings
* Django-Livesettings是一个从Satchmo Project
_拆分的项目。它提供了通过管理界面配置设置的功能,而不是通过编辑“settings.py”。*
也许它对你有帮助。
答案 4 :(得分:2)
老实说,当我分析他的代码时,我会得到更多的Django。在版本1.4.5中做了它(遵循下面的模块):
的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;重要的方法 - new_method_proxy
功能选项,但它有风险。在蟒蛇" _"将该属性视为受保护。
from django.conf import settings
settings._wrapped.INSTALLED_APPS = () ## *really work*
在以下项目中:https://github.com/alexsilva/DJPlugins 您可以在运行时看到此变量被修改。该项目的想法已经开始运作。
答案 5 :(得分:1)
您可以使用.configure()
模块的推荐的settings
方法:
from django.conf import settings
settings.configure(DEBUG=True)
settings
模块具有其他便捷功能。选中docs。
答案 6 :(得分:0)
您不能直接修改settings.py文件 例如: 如果您想在运行时更改数据库,则应该分离数据库的配置
# 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
...
在逻辑视图中调用
# view.py
from ../Projecr_name/user_database import user_database
class Some(...):
def Some(request):
user_database['user_db']['NAME']='user2'
然后您可以使用这种方式在运行时更改任何设置