Python 在测试中修改Django设置
来自Django: 您不应该在运行时更改应用程序中的设置。对于 例如,不要在视图中执行此操作:Python 在测试中修改Django设置,python,django,testing,django-settings,Python,Django,Testing,Django Settings,来自Django: 您不应该在运行时更改应用程序中的设置。对于 例如,不要在视图中执行此操作: from django.conf import settings settings.DEBUG = True # Don't do this! 您应该指定给设置的唯一位置是在设置文件中 我注意到Django测试代码改变了设置。为什么可以在那里进行设置?可以更改设置吗? 简短回答: 不,除非你在启动时这样做 长答案: Django文档是正确的,您不应该在运行时修改设置。这意味着,在应用程序启动后
from django.conf import settings
settings.DEBUG = True # Don't do this!
您应该指定给设置的唯一位置是在设置文件中
我注意到Django测试代码改变了设置。为什么可以在那里进行设置?可以更改设置吗?
简短回答:
不,除非你在启动时这样做
长答案:
Django文档是正确的,您不应该在运行时修改设置。这意味着,在应用程序启动后,不会进行任何设置修改,例如更改views.py
、serializers.py
、models.py
或开发过程中添加的其他模块中的配置。但是,如果设置依赖于局部变量,则可以修改设置,如果您在启动时这样做,并且您完全知道会发生什么
您可以在测试时修改设置吗?
是的,如果你认为你需要的话。在单元测试中,您可以通过override_settings
更改设置值以进行测试,请参见用法示例。
此外,这个装饰器所做的一切——用提供的值覆盖设置,并在测试通过后恢复设置值(执行装饰函数)
为什么Django在测试代码时会修改它们。
从我看到的情况来看,他们更改设置只是为了测试目的,也是他们唯一要做的事情——将本地主机添加到允许的主机,这样他们就可以使用本地域测试代码。像这样的例子对我来说似乎非常合理,因为更改只在单元测试设置期间进行一次。想象一下每次调用override\u设置
都会有多么可怕
一般性建议。
尽量不要这样做,没有必要修改设置,如果有,想想看,也许设置不是可变设置的正确位置?
如果您想在运行时修改设置-请注意,设置可能会缓存在某个地方,复制并访问到所有地方-这对于新的bug来说是一个很大的空间。它没有什么不好的地方,除了由于修改设置的旧/新值而导致系统出现意外行为
希望这有意义。答案是这样的: 您不应该在运行时更改应用程序中的设置 单元测试代码不是应用程序的一部分,因此该语句不适用于单元测试 为什么可以在那里做 如上所述,在测试期间覆盖设置是完全可以的,只要您以本地化的方式进行(因为测试有时以多线程的方式运行) 以下是他们的建议:
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/')
见文件: