Рубрики
Без рубрики

Исправление анти-паттернов Django в Sentry

Django Doctor Audits и Auto исправляет анти-паттерны Django. Мы проверили кодовую базу Sentry по проблемам … Помечено с Django, Python, WebDev, Codequality.

Django Doctor Audits и Auto исправляет анти-паттерны Django. Мы проверили Часовой Кодовая база для проблем, препятствующих обслуживаемости, чтобы увидеть, как мы можем помочь, и в конечном итоге создан запрос на тягу исправить некоторые из них. В этом посте мы разбим наиболее эффективные проблемы, и как они могут избежать.

Отсутствует обратная миграция

Миграция данных Джанго имеет два аспекта: вперед и назад. Если разработчик хочет отменить миграцию, то должна быть указана обратная сторона. Тем не менее, многие проекты имеют миграции, которые пропускают это, потому что по умолчанию миграция данных скелета, созданная Django, показывает только обработчик форвардов, и, следовательно, примерно 22% кодовых баз Django, которые мы проверяли, Sentry имеет некоторые миграции данных, которые не поддерживают отмену миграции.

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

Таким образом, во всех затронутых миграциях данных в Sentry Pull запрос Мы предложили следующее:

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

Проверка правдивости запроса:

Запись лениво оценивается – Это означает, что записи не считываются из базы данных, пока код не взаимодействует с данными. Вот почему мы можем сделать queryset.all () без загрузки всех записей из базы данных.

Однако, если какой -то код делает Если Queryset Затем запрос сразу оценивается: все записи в Queryset читаются из базы данных. Возможно, десятки, возможно, тысячи, возможно, больше. Проверка, если запрос является правдой/Falsey, гораздо менее эффективна, чем проверка queryset.exists () Анкет

Как 50% кодовых баз, которые мы проверили , Sentry страдает от этого анти-паттерна. Тем не менее, исправление простое после того, как проблема является идентификатором: в Sentry Pull запрос Мы предложили следующее:

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

URL Anti-Patterns

Как 40% проектов Django, которые мы проверили, Sentry имеют некоторые анти-паттерны, связанные с URL:

Дубликат Имя URL:

Django предоставляет очень удобный метод генерации URL -адресов: предоставление каждому URL -адресу имени, а затем позволяет разработчику использовать {% URL Template Tag или Обратный Чтобы генерировать URL.

Но что произойдет, если два URL -адреса имеют одно и то же имя? Например Здесь и Здесь Оба имеют имя 'sentry-project-event-redirect'

Это будет означать, что половина времени шаблонов будет ссылаться на неправильное место: если шаблон пытается ссылаться на представление в систему через {% URL "Sentry-Project-Event-redirect" Можете ли вы быть уверенным, что это пойдет в нужное место? Нет.

Как это произошло? Ну, это легко пропустить при чтении кода. Urls.py составляет более 600 строк очень плотного кода. Легко не видеть иглу в стоге сена без инструментов, чтобы помочь.

Твердый URL

Упорные URL -адреса в шаблонах усложняют изменение URL -адресов и облегчают связь с неправильной страницей – поэтому наносят ущерб обслуживаемости. Сентри был Один случай жесткого кодирования URL, который очень хороший: только один случай в огромной кодовой базе, и это было указывало на домашнюю страницу, что вряд ли изменится.

Твердые статические у URL-адреса актива

Документация Django предлагает не жесткие статические URL-адреса, а вместо этого используется {% Статический тег шаблона . {% Статический ... Возвращает путь, который браузер может использовать для запроса файла. В самых простых, это вернет путь, который исследует файл в вашей локальной файловой системе. Это хорошо для вашей местной среды разработки, но в Prod мы, скорее всего, будем использовать Сторонние библиотеки такие как отбелить или Django Storages Чтобы повысить производительность производственного веб -сервера.

Мы видели три экземпляра статических статических URL-адресов с твердыми кодировками, все они в тот же файл Анкет Они препятствуют обслуживаемости несколькими способами. Ключевым является, если Storage_backend изменяется на одну оптимизацию для скорости статической доставки файлов, затем может произойти следующее:

  • Расположение файла может изменить имя файла
  • Служение из S3 (или аналогичного) может изменить домен, который файл обслуживается из

Поэтому жесткий кодирование статического URL-адреса сломается, если Storage_backend был изменен, например, отбелить или Django Storages

Эта проблема обсуждается здесь о более подробной информации.

Есть ли у вашей кодовой базы Django эти проблемы?

Со временем для технического долга легко проникнуть в вашу кодовую базу. Я могу проверить это для вас в django.doctor , или может Просмотрите свой GitHub PRS :

Или попробуйте Django Refactor Challenge Анкет

Оригинал: “https://dev.to/djangodoctor/fixing-django-anti-patterns-in-sentry-m4f”