当前位置: 首页 > 面试题库 >

在运行时更改Django设置

秦宏硕
2023-03-14
问题内容

我想向管理界面公开一些(特定于应用程序的)设置,以便用户可以轻松地更改它们,也不必重新启动Django。

我应该怎么做?

我在http://djangopackages.com/grids/g/live-setting/上签出了应用程序(btw django-constance最吸引人),但实际上所有这些应用程序所做的就是将值存储在数据库中,从而提供了一个网站。界面来更改它们,并进行缓存。Django内置的前两个功能不是吗?

我看到的最大缺点是,这些应用程序都不能直接替换这些设置的旧位置(settings.py),需要我迁移到它们的表示法,并且经常添加其他上下文处理器以在模板中访问它们。

我不能只是这样做吗?

  1. 为我的设置创建一个模型(这为我提供了各种类型和验证)
  2. 实例化一个这样的对象来保存我的设置(这允许用户在管理界面中对其进行编辑)-我可以像使用其他模型一样将默认值作为固定装置来转储
  3. 包装settings.py,以便对我的设置进行数据库查询-http: //www.loose-bits.com/2011/04/extending-django-settings-with-derived.html
    从我目前的幼稚角度来看,我看到的唯一缺点是:

  4. 添加或更改可用设置需要进行模式迁移(南)。- 我可以忍受这一点。

  5. 我有一个可能带有多个实例的模型,但实际上只需要一个实例。-在某些时候实际上可能是有用的功能。
  6. 性能/缓存:查看http://code.djangoproject.com/svn/django/trunk/django/conf/,我必须在设置包装器和/或模型中添加一些技巧,以便更改模型清除或更新缓存的值。-似乎不是火箭科学。
  7. 在另一个项目中执行相同操作将再次需要类似的工作。-我认为settings.py中只有一个字典常量,其中包含要查找的模型名称和字段名称,这将有所不同。
    这不是两全其美的吗-运行时管理员(具有所有优势),数据库后端,缓存以及我的任何设置。USED_TO_BE_IN_SETTINGS_DOT_PY不需要任何更改。我想念什么吗?

问题答案:

AFAIK,Django设置应该是不可变的。造成这种情况的原因有多种,最明显的原因是Django不了解服务器的执行模型(prefork /多线程)。

另外,你无法从Django模型本身加载设置,因为需要先加载设置,然后才能在ORM中使用任何内容。

因此,基本上,你有两种解决方案:

  • 你可以使用任何较低级别的数据库访问机制从数据库中引导设置来加载它们;要么
  • 你可以只在其他模型中定义设置,并在需要时直接获取它们。
    首先是令人难以置信的黑客攻击,我不建议这样做。第二种方法更直接,更清洁,但是需要你改变惯常的习惯(from django.conf import settings)。

第二种方法可能是你链接到的第三方应用程序实现的方法。



 类似资料:
  • 问题内容: 如何在运行时更新此环境变量,以便ctypes可以在任何地方加载库?我尝试了以下方法,但似乎都没有用。 问题答案: 在运行诸如Python之类的程序时,动态加载程序(ld.so.1或类似的文件)已经读取LD_LIBRARY_PATH,并且此后将不会注意到任何更改。因此,除非Python软件本身评估LD_LIBRARY_PATH并使用它来构建可能的库路径名或要使用的等效函数,否则在脚本中设

  • 我需要在运行时更改与数据库的连接。例如,如果请求的参数是BD1,则连接数据库1,如果是BD2,则连接数据库2,等等。 我用的是Spring靴。最好的方法是什么。 我有这个,但不知道说我的存储库如何使用。

  • 我有个关于骆驼和计时器的问题。我有几个计时器,其中一个我想在运行时更新。我正在使用osgi blueprint来配置适当的周期。因此,我如何改变计时器(名称,我知道),例如从路由?

  • 问题内容: 每月都会生成此表。基本上所有 月度 表的表结构都是相同的。 由于仅使用不同的表名来映射同一实体将需要大量工作, 由于实体的表名毕竟具有相同的表结构,是否可以按以下方式更改实体的表名? 如果没有,您可以建议什么方法? 问题答案: 由于实体的表名毕竟具有相同的表结构,是否可以按以下方式更改实体的表名? 这实际上是不可能的,至少对于标准JPA(这不是我对非标准JPA所做的)至少不是这样,如在

  • 我正在尝试在运行时更改语言。它在API29(android版本10)上运行得很好。我需要使它在牛轧糖7.1.1(API 25)上工作。这是一场噩梦。如果我必须通过设置更改设备语言..,它可以工作。我可以看到正确的drawable和字符串(strings.xml) 我的目标是使语言切换在运行时发生。 我正在onResume()中调用activity.recreate()。屏幕变黑。我得到一个异常,它