Django: отследить причины DeprecationWarning

Я обновился до Django 1.4, и теперь, когда я запускаю свой сервер разработки, я получаю следующее предупреждение:

/home/flc/venvs/myprj/lib/python2.6/site-packages/django/views/generic/simple.py:8:

Предупреждение об устаревании: общие представления на основе функций устарели; вместо этого используйте представления на основе классов. Предупреждение об устаревании

Я отследил большинство причин этого и устранил их, внеся следующие изменения:

django.views.generic.simple.direct_to_template => django.views.generic.base.TemplateView django.views.generic.simple.redirect_to => django.views.generic.base.RedirectView

так далее

Тем не менее, я все еще получаю предупреждение и не могу понять, что я пропустил. Как мне получить фактический модуль и строку в моем коде, которые вызывают предупреждение об устаревании?


person FunLovinCoder    schedule 04.09.2012    source источник


Ответы (2)


Вы можете использовать модуль warnings, чтобы вызвать ошибку для DeprecationWarning.

Временно добавьте следующий фрагмент в верхнюю часть urls.py вашего проекта:

import warnings
warnings.simplefilter('error', DeprecationWarning)

DeprecationWarning теперь вызовет ошибку, поэтому, если debug=True, вы получите знакомую желтую страницу ошибки Django с полной трассировкой.

После того, как вы отследили источник предупреждений об устаревании, не забудьте удалить фрагмент! Обратите внимание, что предупреждение об устаревании может быть вызвано сторонним приложением, а не вашим собственным кодом.

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

person Alasdair    schedule 04.09.2012
comment
Похоже, это был регистрационный пакет, который вызывал DepricationWarning. Без твоего фрагмента мне потребовалось бы гораздо больше времени, чтобы отследить. Большое спасибо. - person FunLovinCoder; 04.09.2012
comment
Это пахнет так, как будто это должна быть настройка - DEBUG_WARNINGS или аналогичная (настолько, насколько мы все ненавидим идею большего количества настроек) - person s29; 06.02.2013
comment
@ s29 Зачем добавлять еще один параметр, если для реализации приведенного выше ответа требуется всего две строки кода? - person Alasdair; 06.02.2013
comment
Батарейки в комплекте, вот почему. Мне не нужно было google/stackoverflow что-то вроде этого. - person s29; 08.02.2013
comment
Было бы полезно, если бы приведенный выше фрагмент был включен в документацию Django, но это не означает, что он оправдывает настройку. Что, если вы хотите относиться к PendingDeprecationWarning и DeprecationWarning по-разному? Как только вы узнаете о warnings.simplefilter, изменить его будет несложно. Если функциональность скрыта за настройкой, вам нужно вернуться к документации Django. Для меня включенные батареи означают, что вам не нужно, скажем, реализовывать собственную функцию для декодирования данных, закодированных в форме. Однако управление предупреждениями не так уж сложно, это одна строка кода после импорта. - person Alasdair; 08.02.2013

Вы также можете сделать это в командной строке, поэтому вам не нужно изменять код. Например:

python -We manage.py runserver --traceback

Официальный документ находится здесь. Вы можете использовать сокращения, а e в -We означает преобразование предупреждений в error.

person user193130    schedule 17.10.2013