【发布时间】:2019-05-25 23:29:32
【问题描述】:
我们将 Django 用于Speedy Net and Speedy Match(当前为 Django 2.1)。我们的一些设置被模型使用。例如:
class USER_SETTINGS(object):
MIN_USERNAME_LENGTH = 6
MAX_USERNAME_LENGTH = 40
MIN_SLUG_LENGTH = 6
MAX_SLUG_LENGTH = 200
# Users can register from age 0 to 180, but can't be kept on the site after age 250.
MIN_AGE_ALLOWED_IN_MODEL = 0 # In years.
MAX_AGE_ALLOWED_IN_MODEL = 250 # In years.
MIN_AGE_ALLOWED_IN_FORMS = 0 # In years.
MAX_AGE_ALLOWED_IN_FORMS = 180 # In years.
MIN_PASSWORD_LENGTH = 8
MAX_PASSWORD_LENGTH = 120
MAX_NUMBER_OF_FRIENDS_ALLOWED = 800
PASSWORD_VALIDATORS = [
{
'NAME': 'speedy.core.accounts.validators.PasswordMinLengthValidator',
},
{
'NAME': 'speedy.core.accounts.validators.PasswordMaxLengthValidator',
},
]
(在https://github.com/speedy-net/speedy-net/blob/staging/speedy/net/settings/global_settings.py 中定义)。然后在我使用的模型中:
from django.conf import settings as django_settings
class User(ValidateUserPasswordMixin, PermissionsMixin, Entity, AbstractBaseUser):
settings = django_settings.USER_SETTINGS
(然后在类中使用settings的属性,如settings.MIN_SLUG_LENGTH)。
问题是,当我尝试在测试中覆盖此类设置时(您可以在 Can I define classes in Django settings, and how can I override such settings in tests? 上查看我的问题和答案),User.settings 保持不变,并且不会被我尝试覆盖的设置所覆盖。这是一个问题,因为在模型中我将settings.MIN_SLUG_LENGTH 传递给了验证器,其他模型也传递了其他值。是否可以定义模型和设置,以便在生产和测试中都使用正确的设置,包括当我想要覆盖它们时?
我知道https://docs.djangoproject.com/en/dev/topics/testing/tools/#overriding-settings 的这句话:
警告
设置文件包含一些仅供参考的设置 在 Django 内部初始化期间。如果你用 override_settings,如果您通过 django.conf.settings 模块,然而,Django 的内部访问它 不同。有效地,使用 override_settings() 或 具有这些设置的 modify_settings() 可能不会做什么 你期望它做。
我们不建议更改 DATABASES 设置。改变 CACHES 设置是可能的,但如果您使用的是有点棘手 使用缓存的内部结构,例如 django.contrib.sessions。 例如,您将不得不重新初始化会话后端 使用缓存会话并覆盖 CACHES 的测试。
最后,避免将您的设置别名为模块级常量 override_settings() 不会对这些值起作用,因为它们只是 第一次导入模块时进行评估。
我理解在这种情况下是相关的,但我如何定义设置以便我可以覆盖它们?
speedy/core/base/test/models.py 中的函数 _1___set_up 是一种使测试正常工作的解决方法,但这是一种 hack,我认为从长远来看这不是一个好的解决方案。
【问题讨论】:
-
你真的需要
USER_SETTINGS是一个类,还是可以是一个类的实例? -
@aaron 我不知道。目前它是一个类。
标签: python django overriding django-settings