Django中冗长的弃用警告

9
从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的原因?如何使这些警告更详细?

你能展示一下如何发起请求吗?尽管不应该这样做,但肯定有某些东西正在访问raw_post_data属性。 - Simeon Visser
只需要使用 self.client.get(url, params) 即可。我相信这与问题无关,因为我在许多测试方法中都进行了此类请求,但仅此一个会导致警告出现。所以我猜测这是因为在 libs 中导入了某些内容导致的警告。不管怎样,还是非常感谢您的帮助。 - alecxe
1
我明白了。你在libs中导入了任何与Django或requests/views相关的内容吗?在Django 1.5中,raw_post_data属性没有被访问,但是可能会通过迭代所有属性来分析请求。也许是mock?或者是libs中的其他东西? - Simeon Visser
libs 中有很多导入,但与请求/视图无关,除了 from django.conf import settings。然后...就是这样:raven 是原因 - 我手动找到了。谢谢,但我仍然想知道在测试运行期间是否可以以某种方式看到原因。我会更新问题。 - alecxe
我认为你做不到。当引发“DeprecationWarning”警告时,访问了raw_post_data属性,但你无法知道是谁访问了它。因此,没有任何标志可以启用以使其更详细。 - Simeon Visser
是的,但是据我所知,首先我应该以某种方式(可能是使用warnings模块)让Django将警告视为错误,然后在此警告期间获取回溯并将其抛出到标准输出。无论如何,谢谢你的帮助! - alecxe
2个回答

24
您可以通过命令行选项-W设置Python warning control,以便在出现DeprecationWarning时引发带有traceback的异常,而不是普通的简单警告。任何特定的警告都可以通过消息、类别、模块、行或它们的组合进行过滤。
示例:
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及更高版本通常会忽略DeprecationWarning,除非它们被重新启用,例如通过-Wd选项或环境变量export PYTHONWARNINGS="d"。这在开发机器上很有用,但不适用于生产环境。

5
这段内容摘自类似的问题
你可以使用警告模块来针对DeprecationWarning引发错误。
暂时将以下代码片段添加到项目的urls.py的顶部:
import warnings
warnings.simplefilter('error', DeprecationWarning)
DeprecationWarning现在会引发错误,因此如果debug=True,您将得到熟悉的黄色Django错误页面和完整的回溯信息。

1
是的,我看到了这个,但不幸的是它并没有起作用 - 当我将其添加到urls.pysettings.py时,在测试运行期间我根本看不到警告。我会尝试找出原因,如果它有效,我会接受答案。感谢您的参与。 - alecxe
找到了,问题出在 raven 本身。它在访问 raw_post_data 时吞噬了所有类型的异常 - 这就是为什么我在同一位置看到了警告,但没有看到异常(参见源代码)。所以,提供的解决方案有效。谢谢! - alecxe
@SunnySydeUp,决定接受您的答案,并授予hynekcer卓越的替代解决方案赏金奖励。希望您也认为这很公平。 - alecxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接