Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在测试中修改Django设置_Python_Django_Testing_Django Settings - Fatal编程技术网

Python 在测试中修改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文档是正确的,您不应该在运行时修改设置。这意味着,在应用程序启动后

来自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/')
见文件: