Подтвердить что ты не робот

Худшие практики в Django, которые вы когда-либо видели

Каковы худшие ошибки, сделанные с помощью рамки Django, которые вы заметили? Вы видели какие-то настоящие злоупотребления, возможно, это должно быть предупреждением в документах Django?

4b9b3361

Ответ 1

Слишком много логики в представлениях.

Раньше я писал представления, которые могли бы вписаться в 40 строк. Теперь я рассматриваю более 2-3 уровней отступов, 10 или около того LOC или несколько встроенных комментариев, чтобы иметь запах кода.

Искушение состоит в том, чтобы писать минимальные модели, определять маршрутизацию URL-адресов, а затем делать все остальное в представлении. В действительности вы должны использовать модельные методы, менеджеров, теги шаблонов, контекстные процессоры, представления на основе классов с абстрактными базовыми представлениями... все, чтобы код представления был прост и читабельным. Логика вокруг сохраняющих форм должна идти в Form.save(). Логика, повторяющаяся в начале или в конце нескольких видов, должна идти в декораторах. Повторная логика отображения должна находиться в include d шаблонах, тегах шаблонов и фильтрах.

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

Ответ 2

Не разбивать содержимое на несколько приложений. Это не столько о повторном использовании, сколько о том, чтобы иметь дюжину моделей и более 100 просмотров в одном приложении, это проклято нечитаемо. Кроме того, мне нравится иметь возможность автоматически сканировать мой urls.py файл, чтобы узнать, где находится URL-адрес, когда у меня есть 100 URL-адресов, которые становятся все сложнее.

Ответ 3

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

Эта ошибка находится на странице NewbieMistakes, поэтому, надеюсь, у меня хорошая компания.

Это правильный способ сделать это, если кому-то интересно.

sessionlist = request.session['my_list']
sessionlist.append(new_object)
request.session['my_list'] = sessionlist

Ответ 4

Я думаю, что самая большая проблема заключается в том, что люди пытаются кодировать, как если бы это была Java/C: они пытаются создать слишком общие приложения, которые никогда не должны меняться при изменении будущих требований (что необходимо для Java/C, поскольку эти приложения не являются так легко изменить/перепроектировать). Какие результаты - это ужасно сложное приложение, которое негибким и невозможно поддерживать.

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

Ответ 5

  • Обезвреживание с предварительными и последующими событиями.

    Если вы не можете просто сделать это в save, вам следует, вероятно, пересмотреть то, что вы пытаетесь сделать. В конце концов, это просто реляционная база данных под капотом. Если то, что вы делаете, становится слишком сложным, у вас будут проблемы с отображением ORM.

  • Попытка написать uber-generic - одно представление делает все это - функциональность. Функции просмотра - это функции по какой-либо причине. Они могут использовать модули, пакеты, объекты, другие функции и т.д. Они могут быть короткими и похожими, не будучи запахами кода.

    Если вам нужно использовать 10 строк кода для создания объекта uber-generic-do-it-all, и это была бы 12-строчная функция просмотра без объекта uber-generic-do-it-all, тогда Убер-объект не помогает.

  • Наложение слишком большого количества сложного класса объектов на классы модели ORM. Если для этого требуются абстрактные базовые классы или метаклассы, это не будет хорошо работать на уровне ORM.

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

Ответ 6

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

Всегда убедитесь, что результаты вашего запроса ограничены, то есть:

results = MyModel.query.all()[:100]

не

results = MyModel.query.all()

или используйте итератор:

for result in MyModel.query.iterator():

Ответ 7

Не использовать поля raw_id для ключа для 10000+ объектов, а затем интересно, почему посещение администратора приводит сервер на колени

Ответ 8

Я испытал худшую практику: используйте что-то еще, что идентификатор по умолчанию в качестве первичного ключа модели.

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

Я думаю, что нет конкретных случаев, которые достаточно специфичны, чтобы вызвать эти проблемы. Я рекомендую сохранить идентификатор вашей модели по умолчанию.

См. Каков наилучший подход к изменению первичных ключей в существующем приложении Django? для деталей

Ответ 9

Моя худшая ошибка заключалась в использовании абсолютного импорта, например <project_name>.<app_name>.models, а не <app_name>.models. Таким образом, когда я создал ветку и хотел проверить ее в другом каталоге (например, наличие и -stable моего проекта), он не запускался. Мне удалось вернуться в одном проекте и использовать только относительный импорт в одном проекте, но в другом, более крупном, мы должны придерживаться его (у нас есть как абсолютные, так и относительные). Я больше не буду повторять эту ошибку.

Ответ 10

В первую очередь я начинаю писать питон код без чтения PEP. Самое худшее, что я бы назвал:

ПРИМЕЧАНИЕ. Вещи, которые я цитирую здесь, DONT'S

1

foo       =  bar

foobar    =  bar

foobarbuz =  bar

2

foo = "foo"
bar = "bar"
foobar = foo + bar //string concat

3

foo = [1,2,3,4,5,6]
foo_ = []
for bar in foo:
  foo_.append(bar)

4

запись операторов импорта с именем проекта

from projectname.appname.models import model

5

Пытается использовать представление как обычные функции python

Обновление: слишком много логики в представлении, а что-то перемещает к помощнику (utils), я имею в виду, что здесь есть плохая практика для перенаправления. Есть люди, которые пишут вспомогательные функции в представлении.

6

Функция/метод без docstring и использование пространства имен никак не связаны с контекстом.