Типичные улучшения

Для поиска по тегу начните название тега с символа '@'.

Улучшения, показаны 40 из 90.

Удаляйте устаревшие страницы

Со временем количество страниц на сайте обязательно будет меняться. Вот было 100 страниц, но затем …

Пересоберите сайт в момент запуска

Если вы меняете шаблон, но скрипт запустить забыли, то столкнётесь со странным поведением программы. Теперь …

Подготовьте сайт к работе без веб-сервера

Если открыть HTML файл напрямую в браузере, без использования веб-сервера, то в консоли браузера появится …

Вынесите chat_id из кода

Сейчас настройка `chat_id` намертво зашита в скрипте и без правок в коде её никак не …

Настройте анимацию корабля

По задумке анимация корабля сменяется каждые два такта. Сейчас это не так. PS. Будьте осторожны, …

Очистите obstacles

В списке препятствий накапливаются объекты. Со временем их становится всё больше.

Отделите STATIC_ROOT от STATICFILES_DIRS

Пока мы занимаемся отладкой django берёт на себя функции веб-сервера и веб-приложения. Обычно эти роли …

Сделайте ссылку на чтение книги крупнее

Это самая важная кнопка на сайте и она оказалась совсем незаметной. Присмотритесь к вёрстке и …

Используйте format_html для подстановки в HTML

Функция `format_html` в Django похожа по своим возможностям на обычное форматирование строк. Она тоже подставляет …

Уберите из админки огромные select-поля

Для полей `ForeignKey` Django в админке использует виджет ``. Он предлагает пользователю выбрать из одну …

Почините Add another для картинок

![](https://dvmn.org/filer/canonical/1600270419/713/) [Ссылка на скриншот](https://dvmn.org/filer/canonical/1600270419/713/) Там, где загружена картинка, слева показано название загруженного файла, а справа …

Удалите пробелы из примера .env

В вашем README есть пример заполнения файла с конфигами. Дело в том, что так их …

Протестируйте программу на неполном словаре

Метод словаря `get(key)` отличается от обычного индекса `[key]` реакцией на отсутствующий ключ. Вместо исключения `KeyError` …

Используйте verbatim на весь тег

Вы используете `{% verbatim %}`, но он захватывает какую-то рандомную область в шаблоне. Получается, что …

Настройте метод *_or_create

Оба метода и `get_or_create`, и `update_or_create` ищут записи в БД с точным совпадением по всем …

Зафиксируйте размеры кнопок

![](https://i.imgur.com/9AyvGj2.png) По клику на кнопку Play сдвигается кнопка справа от неё. Это потому, что ширину …

Почините UI звука плеера

Если посмотреть на другие плееры, например, на YouTube, то там, когда звук включен -- показывается …

Избавьтесь от лишнего каталога в архиве

В архив вместе с файлами попадает лишний каталог с жутким хэшом `7kna` в названии.

Дополните кнопки бота ручным вводом

С точки зрения бота кнопка - это просто шорткат для быстрого ввода сообщения. Кнопки не …

Не доверяйте FloatField точные вычисления

FloatField хранит данные как питоновский `float` и наследует все его проблемы. Например, вычисления с `float` …

Проверьте адрес перед редиректом

С параметром `next` есть известная уязвимость: если не проверять куда вы делаете редирект, то ваш …

Почините ALLOWED_HOSTS

В чём тогда смысл настройки, если в ней лежат домены, которые вам не принадлежат? Она …

Запретите отрицательные цены в БД

Сейчас цена заказа может оказаться отрицательной, по крайней мере база данных такого не запрещает. Можно …

Сбросьте настройки после анимации

Вы не сбросили настройки терминала, которые добавили с помощью ANSI-кодов. В Repl это не заметно, …

Отключите кэш в дата-миграции

Вообще, в питоне не принято сильно заботиться о памяти. Но это до тех пор, пока …

Перекодируйте текстовый файл после скачивания

Когда сервер присылает вам текстовый файл, то он может оказаться в любой кодировке. Название этой …

Почините извлечение filename из url

Нельзя отрезать кусочек `url` после последнего `/` и надеяться, что это название файла. В url …

Оберните код в транзакцию

Транзакции позволяют объединить несколько запросов к БД в одну неделимую операцию. Либо сработают все запросы, …

Дождитесь закрытия сокета

Начиная с Python 3.7 в asyncio появился дополнительный метод у сокета. Он позволяет не только …

Запретите отрицательное/нулевое количество товаров

Сейчас количество товаров в заказе может оказаться отрицательным, по крайней мере база данных такого не …

Возьмите настройки из django.conf.settings

Импорт настроек проекта напрямую из файла `settings.py` ломает механизм конфигурации Django. Проблем здесь сразу несколько. …

Используйте монотонное время

Результат вызова `time.time()` не всегда растет со временем. Операционная система сверяет свои часы с сетевыми, …

Отключите интерактивный ввод в скриптах деплоя

Скрипты деплоя нужны для автоматизации, а хорошая автоматизация должна работать быстро, тихо и незаметно. Если …

Настройте проброс данных через реверс-прокси

Реверс-прокси -- это посредник, задача которого "передать" запрос от внешнего клиента ко внутреннему веб-сервису. При …

Прервите исполнение bash-скрипта при сбое

Bash-скрипты имеют одну неочевидную особенность: сбой первой команды не отменяет вторую и третью, и они …

Почините HTML title

Вы замечали, что у вкладок браузера есть свои названия? Эти надписи подсказывают на каком сайте …

Перепроверьте инструкции в документации

Инструкции в документации неполны либо содержат ошибки. Возможно, инструкции просто устарели со временем. Воспринимайте инструкции …

Не используйте mutable-types в качестве аргумента по умолчанию

Изучите возможную ошибку на следующем примере: * [least-astonishment-and-the-mutable-default-argument](https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument)

Измените настройки STATICFILES_DIRS

После `BASE_DIR` папка верхнего уровня у всех путей одна

Добавьте в Nginx стандартные прокси-заголовки

Nginx выступает посредником между клиентом и вашим приложением. Он копирует каждый входящий HTTP-запрос и отправляет …

deprecated