Переопределение настроек в Django при использовании моделями - PullRequest
0 голосов
/ 28 декабря 2018

Мы используем Django для Speedy Net и Speedy Match (в настоящее время Django 1.11.17, мы не можем перейти на более новую версию Django из-за одного из наших требований, django-modeltranslation).Некоторые из наших настроек используются моделями.Например:

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, в классе).

Проблема в том, что когда я пытаюсь переопределить такие настройки в тестах (мой вопрос и ответ вы можете увидеть на Могу ли я определить классы в настройках Django,и как я могу переопределить такие настройки в тестах? ), 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 () не будет работать с такими значениямипоскольку они оцениваются только при первом импорте модуля.

Что, как я понимаю, уместно в этом случае, но как определить параметры таким образом, чтобы я мог их переопределить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...