Django:我应该在哪里调用settings.configure?

9
Django的docs文档中说,我可以调用settings.configure而不是使用DJANGO_SETTINGS_MODULE。我希望我的网站项目也能这样做。我应该把settings.configure放在哪个文件中,以便在正确的时间配置我的设置? 编辑:回应Daniel Roseman的评论:
我想这样做的原因是settings.configure允许您将设置变量作为kwargs字典传递,例如:{'INSTALLED_APPS':...,'TEMPLATE_DIRS':...,...}。这将允许我的应用程序用户在字典中指定其设置,然后将该字典传递给我的应用程序中的一个函数,该函数会增加某些必要的设置以使我的应用程序工作,例如添加条目到INSTALLED_APPS
我设想的情况如下。让我们称我的应用程序为“rexe_app”。在wsgi.py中,我的应用程序用户将执行以下操作:
import rexe_app
my_settings = {'INSTALLED_APPS': ('a','b'), ...}
updated_settings = rexe_app.augment_settings(my_settings)
# now updated_settings is {'INSTALLED_APPS': ('a','b','c'), 'SESSION_SAVE_EVERY_REQUEST': True, ...}
settings.configure(**updated_settings)

如果你想要这样做,为什么不直接在用户的项目设置文件中使用 from rexe_app.default_settings import *INSTALLED_APPS += ('a', 'b') 呢? - alko
@alko:我一开始就采用了这种方法,但是当我的软件需要更新时,它并不适用。例如,如果我想将另一个应用程序添加到 INSTALLED_APPS,或者修改其他设置,比如 TEMPLATE_DIRS,我需要告诉所有用户在他们的设置文件中更改它。我的用户希望能够自动和隐形地处理这些更新。 - RexE
不要担心,你只需要在 rexe_app.default_settings 中的 INSTALLED_APPS 中添加新的应用程序,并使用 += 运算符处理即可。然后你的用户只需运行 pip install rexe_app upgrade 即可完成升级。 - alko
@alko:你是说INSTALLED_APPS += ('a', 'b')应该放在用户的项目设置文件中,还是rexe_app.default_settings?我很确定两种方式都不起作用。rexe_app.default_settings无法读取用户的INSTALLED_APPS以进行追加。 - RexE
@RexE,这种方法是否满足您的需求,或者您仍然不确定/正在寻找最佳解决方案,如果是,为什么? - alko
3个回答

5

这并不完全相等,因为设置 DJANGO_SETTINGS_MODULE 会更新默认值,这些默认值可以在 django.conf.settings.global_settings 中找到,而对于 configure 的参数,则完全忽略它们,因此您需要添加一些额外的处理。

请注意,首先,您不能动态修改 INSTALLED_APPS,因为它们仅在设置处理时检查一次。例如,在部署在 Apache 上的应用程序中应用对 INSTALLED_APPS 的修改,您需要重新启动 Apache。

其次,由于设置被导入,因此此点容易受到某些注入的攻击,并且高度容易将它们暴露给用户。

如果这是一个元应用程序,则有两种可能性:

  1. 如果您想要为 `django` 方式的设置提供默认设置,请在您的应用程序的`default_settings.py`中添加以下内容:
        INSTALLED_APPS = ('default_app',)
        
    只需确保您不会在您的应用程序中导入 `default_settings.py`,并要求用户将以下内容添加到他们的settings.py 中:
        from rexe_app.default_settings import *
        INSTALLED_APPS += ('users_app',)
        
    这实际上将使您的最终用户的 `INSTALLED_APPS` 设置为 `('default_app', 'users_app', )`。
  2. 如果您需要在 `rexe_app` 方式下设置,则可以在您的应用程序的 `__init__.py` 中默认它们:
        from django.conf import settings
        REXE_APP_CONFIG_PARAM = getattr(settings, 'REXE_APP_CONFIG_PARAM', 
            'default_param_value')
        
    因此,当用户需要更改默认的 `REXE_APP_CONFIG_PARAM` 时,只需添加以下内容:
        INSTALLED_APPS = ('rexe_app')
        REXE_APP_CONFIG_PARAM = 'user_param_value'
        
    到他的 `settings.py`。

感谢提供信息和注意事项!幸运的是,我已经成功使用了settings.configure方法,所以现在我会尝试使用它。 - RexE

3

这要取决于您的wsgi脚本,请查看文档

您可以运行mysite.settings.configure()而不是os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'


0

如果您正在使用wsgi,则在运行应用程序之前在wsgi脚本中调用它。

如果您想为开发服务器执行此操作,请将其作为命令行选项传递(在同一页上提到)。

django-admin.py runserver --settings=mysite.settings

尽管它不起作用,但它无法找到我的项目名称,即使我在wsgi.py中完全相同,似乎缺少某些东西。 - Conor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接