来自Django docs:
您不应在运行时更改应用程序中的设置。对于 例如,不要在视图中执行此操作:
from django.conf import settings settings.DEBUG = True # Don't do this!
您应该为设置分配的唯一位置是设置文件。
我注意到Django测试代码does会改变设置。为什么可以在那里做到?
答案 0 :(得分:1)
简短回答 : 不,除非你在创业期间这样做。
长答案 :
Django文档是正确的,您不应该在运行时修改设置。这意味着,应用启动后无需修改设置,例如更改views.py
,serializers.py
,models.py
或您在开发过程中添加的其他模块中的配置。但如果你在启动时这样做依赖于局部变量就可以修改设置,并且你完全了解会发生什么。
是的,如果你认为你需要它。您可以在单元测试中依赖override_settings
更改设置值以进行测试,请参阅使用示例here。
此外,此装饰器所做的一切 - 覆盖了提供的值的设置,并在测试通过后恢复设置值(执行修饰函数)。
从我看到的情况来看,他们仅为测试目的更改设置,他们唯一做的事情是 - 将本地主机添加到允许的主机,以便他们可以使用本地域测试代码。像这样的例子对我来说似乎很合理,因为改变只进行一次并且在单元测试设置期间。想象一下,每次都有overrride_settings
电话,这将是滔天看。
尽量不要,没有必要修改设置,如果有 - 想一想,也许设置不适合可变设置? 如果你想在运行时修改设置 - 请注意,设置可能会被缓存到某个地方,复制和访问所有地方 - 这是一个充足的空间来容纳新的错误。除了由于修改后的设置的旧/新值而导致系统出现意外行为外,没有什么不好的。
希望这是有道理的。
答案 1 :(得分:0)
答案如下:
您不应在运行时更改应用程序中的设置。
单元测试代码不是您的应用程序的一部分,因此该声明不适用于单元测试。
为什么可以在那做?
如上所述,如果您以本地方式进行设置(因为有时以多线程方式运行测试),则可以在测试过程中覆盖设置。
这是他们推荐这样做的方式:
from django.test import TestCase
class LoginTestCase(TestCase):
def test_login(self):
# First check for the default behavior
response = self.client.get('/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/sekrit/')
# Then override the LOGIN_URL setting
with self.settings(LOGIN_URL='/other/login/'):
response = self.client.get('/sekrit/')
self.assertRedirects(response, '/other/login/?next=/sekrit/')
查看文档: https://docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.SimpleTestCase.settings