Подробные предупреждения об устаревании в Django

После обновления с django 1.3 до django 1.5 я начал видеть эти DeprecationWarnings во время тестового запуска:

path_to_virtualenv/lib/python2.6/site-packages/django/http/request.py:193: DeprecationWarning: HttpRequest.raw_post_data устарел. Вместо этого используйте HttpRequest.body.

Я искал внутри проекта raw_post_data и ничего не нашел. Так что напрямую в проекте он не использовался. Затем я вручную просмотрел INSTALLED_APPS и обнаружил, что модуль raven все еще использует raw_post_data, и это было причиной, но..

Можно ли увидеть причину DeprecationWarning во время тестового прогона? Как сделать эти предупреждения более подробными?


person alecxe    schedule 05.05.2013    source источник
comment
Можете ли вы показать, как вы делаете запрос? Должно быть что-то, обращающееся к свойству raw_post_data, хотя этого не должно быть.   -  person Simeon Visser    schedule 06.05.2013
comment
Это просто self.client.get(url, params). Я почти уверен, что это не имеет значения, потому что я делаю такие запросы во многих методах тестирования, но только этот вызывает появление предупреждения. Итак, я думаю, это потому, что что-то импортировано в libs, что вызывает предупреждение. В любом случае, спасибо.   -  person alecxe    schedule 06.05.2013
comment
Понимаю. Вы импортируете что-нибудь в libs, что связано с Django или запросами/представлениями? В Django 1.5 доступ к свойству raw_post_data отсутствует, но что-то может анализировать запрос, перебирая все свойства. Возможно mock? Или что-то в libs?   -  person Simeon Visser    schedule 06.05.2013
comment
В libs есть куча импортов, но ничего связанного с запросами/представлениями, кроме того, что есть from django.conf import settings. А.. вот оно: ворон причина - разобрался вручную. Спасибо, но я все же хочу знать, мог ли я как-то увидеть причину во время тестового прогона. Я обновлю вопрос.   -  person alecxe    schedule 06.05.2013
comment
Я не думаю, что вы можете. Свойство raw_post_data доступно, но когда DeprecationWarning поднято, вы не будете знать, кто к нему обращался. Таким образом, нет никакого флага, который можно было бы включить, чтобы сделать его более подробным.   -  person Simeon Visser    schedule 06.05.2013
comment
Да, но, как я понимаю, сначала я должен как-то (может быть с помощью модуля warnings) заставить django воспринимать предупреждения как ошибки, потом я должен получать трассировку во время этого предупреждения и кидать его в stdout. Спасибо за помощь в любом случае!   -  person alecxe    schedule 08.05.2013


Ответы (2)


Это взято из похожего вопроса.

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

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

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

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

person SunnySydeUp    schedule 08.05.2013
comment
Да, я это видел, но, к сожалению, это не работает - когда я добавляю это в urls.py или settings.py, я вообще не вижу предупреждений во время тестового прогона. Я постараюсь выяснить, почему, и приму ответ, если он сработает. Спасибо за участие. - person alecxe; 08.05.2013
comment
Нашел, проблема была в самом raven. Он потреблял все типы исключений при доступе к raw_post_data — вот почему я видел предупреждения и не видел исключений в одном и том же месте (см. источник). Итак, предоставленное решение работает. Спасибо! - person alecxe; 09.05.2013
comment
@SunnySydeUp, решил принять ваш ответ, но наградить hynekcer наградой за его замечательное альтернативное решение. Надеюсь, вам это тоже покажется справедливым. - person alecxe; 09.05.2013

Вы можете установить управление предупреждениями Python с помощью параметра командной строки -W, чтобы вызвать исключение с < strong>traceback для DeprecationWarning, например для ошибок, вместо обычного простого предупреждения один раз. Любое конкретное предупреждение может быть отфильтровано по сообщению, категории, модулю, строке или по их комбинации.

Примеры:

python -W error:"raw_post_data has been deprecated" manage.py test

python -W error::DeprecationWarning manage.py test

python -W error:::django.http.request manage.py test

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


Python 2.7 и более поздние версии обычно игнорируют предупреждения об устаревании, если они не были повторно активированы, например. опцией -Wd или переменной окружения export PYTHONWARNINGS="d". Это может быть полезно на машинах разработки, но не на производстве.

person hynekcer    schedule 09.05.2013