Everything you wanted to know
about the Django framework

Анти-шаблон local_settings.py

В мире разработки есть анти-шаблон, который предлагает использовать исполняемый код в качестве средства хранения значений конфигурации разных стадий проекта: разработка, тестирование, рабочая версия. Во вселенной Python обычно это выглядит так:

# Внимание! Это анти-паттерн
try:
    from .local_settings import *
except ImportError:
    pass

Что означает использование файла local_settings.py для хранения локальных настроек проекта, в то время как сам файл занесен в игнор-список системы контроля версий (например в .hgignore или .gitignore). В таком случае локальный проект в стадии разработки использует исполняемый код вне системы контроля версий.

Если вам такой подход кажется неправильным, то вы на верном пути.

Лучше будет включить локальные настройки, секретный ключ и другие настройки в переменные окружения. Если же переменные окружения вам не подходят, то можно использовать в качестве хранилищ своих настроек файлы в форматах JSON, XML, YAML или те форматы представления данных, которые вам нравятся.

Что может случится, если использовать анти-паттерн local_settings в своем проекте, спросите вы?

Анти-паттерн local_settings

Это означает, что вы используете исполняемый код в процессе разработки, в то время как этот код не доступен другим разработчикам, что может вылиться в кошмар во время отладки проекта.

Но это перкрасно у меня работает!

То, что работает локально и успешно проходит тесты, может генерировать мелкие ошибки, которые не будут обнаружены, пока не станет слишком поздно. Вот пример того, что может случиться (с чем автор столкнулся в работе):

  • в течение многих лет в проекте использовался сторонний пакет для «слугификации», конфигурация была в настройках.

  • разработчик решил написать собственный проект «слугификации», работал отлично локально, поэтому они внесли изменения на сайте, чтобы использовать новые возможности.

  • тесты не учитывали крайние случаи в новой библиотеке.

  • стал использоваться в локальной разработке, а также на рабочем сервере.

  • через несколько дней клиенты в некоторых регионах мира стали жаловаться на то, что записи недоступны.

  • никто не может понять, почему рабочий проект ведет себя по-другому.

Первое, что было проверено — этот печальный кусок (именно кусок, а не часть) кода в настройках модуля:

# Внимание! Это анти-паттерн
try:
    from .local_settings import *
except ImportError:
    pass

У них был исполняемый код вне контроля версий. Что хорошо работало у разработчика, больше нигде не работало. Хватило того, что происходили мелкие незаметные ошибки, которые не были замечены людьми или тестами. Мелкие ошибки разработчика превращаются в большие ошибки у реальных пользователей программного продукта.

И что действительно плохо, так это то, что серьезные ошибки не удается отладить вначале, потому что перенесенный код не соответствует коду из local_settings.py.

Но я не ошибаюсь!

Люди часто говорят: «Я не так глуп, как другие и не совершу такую ошибку».

Но каждый раз в течение последних 20 лет я решаю или помогаю решить проблему, вытекающую из исполняемого кода, который не отслеживался в контроле версий.

Я считаю, что все мы, разработчики, независимо от того, насколько бы ни были талантливы и опытны, можем и будем делать глупые ошибки.

Учитывая все это, почему бы не сделать умную вещь и не включить весь исполняемый код в управление версиями? А уникальные, секретные данные и ключи можно перенести в переменные окружения или файлы конфигурации. Готово!

Как обрабатывать конкретные переменные

Используйте либо переменные среды, либо файлы конфигурации. В самом деле. И не верьте мне на слово, посмотрите на все инструменты развертывания и услуги хостинга, которые рекомендуют такой подход.

Для этого либо определите свой собственный процесс для их обработки, либо используйте сторонний пакет. Лично для Django мне нравится простота использования этой функции в моих различных настройках:

# Хороший код!
from django.core.exceptions import ImproperlyConfigured

def get_env_var(var_name):
    try:
        return os.environ[var_name]
    except KeyError:
        error_msg = f"Set the {var_name} environment variable"
        raise ImproperlyConfigured(error_msg)

SECRET_KEY = get_env_var("SECRET_KEY")

Перевод статьи https://www.pydanny.com/using-executable-code-outside-version-control.html

Поделитесь с другими:

Представления-классы
(Class-Based Views)

Детальное описание и структура классов Django.

Пользовательская модель User

Каждый новый проект Django должен использовать пользовательскую модель User. Официальная документация Django гласит, что это «настоятельно рекомендуется», но я сделаю еще один шаг и без колебаний скажу: вы просто с ума сошли, если не использовали пользовательскую модель раньше.

Исправление ошибок, Django 2.1.8

Выпущена новая версия Django 2.1.8, в которой исправлена ошибка в админке, допущенная в версии 2.1.7: запрещено редактировать inline-элементы для ManyToManyField, если у пользователя есть только разрешение на просмотр.

Аутентификация в Django: полный пример входа, выхода и смены пароля

В этом руководстве вы узнаете, как легко добавить полноценную систему аутентификации приложение Django с функциями входа в систему, выхода из системы, смены пароля и сброса.

Django 2.2 предварительный выпуск 1

Выпущен релиз-кандидат 1 версии Django 2.2, в котором вы можете предварительно протестировать некоторые новые возможности перед выпуском Django 2.2.

Поиск узких мест производительности проекта на Django

При оптимизации производительности веб-приложения распространенная ошибка — начинать с оптимизации самой медленной страницы (или API). Помимо учета времени отклика, мы также должны учитывать трафик, который он получает, чтобы определить порядок оптимизации. В этой статье мы расскажем о веб-приложении Django, найдем узкие места с высокой эффективностью, а затем приступим к их оптимизации для повышения производительности.

Просмотр SQL запросов Django

Django ORM позволяет легко взаимодействовать с базой данных. Чтобы понять, что происходит за кулисами или увидеть производительность SQL, мы можем записать все запросы SQL, которые выполняются. В этой статье мы увидим различные способы достижения этого.

Как подключить виджет выбора даты в Django

Из этого руководства вы узнаете как легко подключить виджет выбора даты в своем проекте Django. Мы узнаем, как установить его вручную, потом как настроить пользовательский виджет и, наконец, как использовать стороннее приложение Django с поддержкой средств выбора даты и времени.

Исправление ошибок, Django 2.0.13

Сегодня был осуществлен новый выпуск исправлений Django 2.0.13. Исправлен сбой в django.utils.numberformat.format_number(), когда число имеет более 200 цифр (#30177).

Новый формат middleware в Django 2

MIddleware (промежуточный слой) используются для модификации объекта приходящего запроса в представление (view) или для модификации объекта ответа, возвращаемого из представления. Они позволяют нам изменять запросы/ответы глобально.

Массовое обновление записей в Django используя аннотации и подзапросы

Как массово обновлять записи в Django с помощью аннотаций и подзапросов.