28 августа 2023 Python Docker Django


Задача, извлеч значение настроек запущенного контейнера Django.

Например, необходимо сбросить локальный кешь Django, настройки этого кеша находятся в settings.py файле в словаре


CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
        "LOCATION": "/var/tmp/django_cache-{}".format(SITE_PREFIX),
        "TIMEOUT": 360,
        "OPTIONS": {
            "MAX_ENTRIES": 1000
        }
    },
    "redis": {
        "BACKEND": "django_redis.cache.RedisCache",

        "LOCATION": REDIS_LOCATION,

        "OPTIONS": {
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
        }
    },
}

В данном случае необходимо извлеч значение CACHES -> default -> LOCATION

Если Django запущено в контейнере то извлечь это значение можно вот таким образом

docker-compose exec -e DJANGO_SETTINGS_MODULE=centrsvet.settings django poetry run python -c 'from django.conf import settings;print(settings.CACHES["default"]["LOCATION"])'
/var/tmp/django_cache-T1

Представленная команда состоит из целого ряда компонентов

  1. docker-compose exec django — обращение виртуальной среде контейнера с Django
  2. -e DJANGO_SETTINGS_MODULE=centrsvet.settings — передача переменной окружения необходимой для корректной загрузки Django
  3. poetry run python -c — запуск Django в контесте менеджера проекта poetry
  4. from django.conf import settings;print(settings.CACHES["default"]["LOCATION"]) — запуск python команды импортирующей настройки и отображающий необходимый параметр

08 августа 2023 Python Django Form Validator custom


Если необходимо выделить поле формы содержащее ошибку то необходимо переопредить форму так

class FeedbackForm(forms.Form):
    name = forms.CharField(label="Имя", max_length=50)
    email = forms.EmailField(label="E-mail", max_length=50)
    phone = forms.CharField(label="Телефон", max_length=20)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for visible in self.visible_fields():            
            if visible.errors:  # при наличии ошибки поля, добавляем css-класс и меняем title
                visible.field.widget.attrs["class"] = "form__input has-error"
                visible.field.widget.attrs["title"] = "".join(visible.errors)
            else:
                visible.field.widget.attrs["class"] = "form__input"

            visible.field.widget.attrs["required"] = True

    def clean_email(self):
        return check_email(self.cleaned_data["email"]).lower()

    def clean_name(self):
        return self.cleaned_data["name"].title()

    def clean_phone(self):
        _phone = self.cleaned_data["phone"]
        _phone = "".join(re.findall("([\\d]+)", _phone))
        if re.match( "^\\+?[1-9][0-9]{7,14}$", _phone):
            return f"+{_phone}"
        raise ValidationError("Телефон не соответствует формату")

Конструктор формы позволяет переопредить настройки виджета поля формы, а так же предоставляет список ошибок обрануженных при валидации формы