Django 中的详细弃用警告
Posted
技术标签:
【中文标题】Django 中的详细弃用警告【英文标题】:Verbose deprecation warnings in Django 【发布时间】:2013-04-29 16:00:25 【问题描述】:从 django 1.3 升级到 django 1.5 后,我在测试运行期间开始看到这些 DeprecationWarnings
:
path_to_virtualenv/lib/python2.6/site-packages/django/http/request.py:193: 弃用警告: HttpRequest.raw_post_data 已被弃用。采用 改为 HttpRequest.body。
我在项目内部搜索了raw_post_data
,但一无所获。所以没有直接在项目中使用。然后,我手动浏览了INSTALLED_APPS
,发现raven
模块仍然使用raw_post_data
,这是原因,但是..
在试运行过程中是否可以看到DeprecationWarning
的原因?如何使这些警告更详细?
【问题讨论】:
您能说明您是如何提出请求的吗?一定有东西在访问raw_post_data
属性,即使它不应该访问。
只是self.client.get(url, params)
。我很确定这不相关,因为我确实在许多测试方法中提出了这样的请求,但只有这一个会导致出现警告。所以我猜这是因为在libs
中导入了一些导致警告的东西。无论如何,谢谢。
我明白了。您是否在 libs
中导入与 Django 或 requests / views 相关的任何内容?在 Django 1.5 中,raw_post_data
属性未被访问,但可以通过遍历所有属性来分析请求。也许mock
?或libs
中的内容?
libs
中有一堆导入,但与请求/视图无关,除了有from django.conf import settings
。而且..这就是:乌鸦是原因-手动弄清楚了。谢谢,但我仍然想知道我是否可以在试运行期间以某种方式看到原因。我会更新问题。
我不认为你可以。 raw_post_data
属性已被访问,但当 DeprecationWarning
被提出时,您将不知道谁访问了它。所以没有可以启用的标志使它更详细。
【参考方案1】:
您可以通过命令行选项-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"
。这在开发机器上可能很有用,但在生产机器上却不行。
【讨论】:
【参考方案2】:这取自a similar question。
您可以使用警告模块为DeprecationWarning
引发错误。
暂时将以下sn-p添加到项目的urls.py
顶部:
import warnings
warnings.simplefilter('error', DeprecationWarning)
DeprecationWarning
现在会引发错误,所以如果是debug=True
,您将看到熟悉的黄色 Django 错误页面以及完整的回溯。
【讨论】:
是的,我已经看到了,但不幸的是,它不起作用 - 当我将它添加到urls.py
或 settings.py
时,我在测试运行期间根本看不到警告.我会尝试找出原因并接受答案,如果它有效。感谢您的参与。
找到了,问题出在raven
本身。它在访问raw_post_data
时吃掉了所有类型的异常——这就是为什么我看到警告并且我没有在同一个地方看到异常(参见source)。因此,提供的解决方案有效。谢谢!
@SunnySydeUp,决定接受您的回答,但要奖励 hynekcer 以表彰他出色的替代解决方案。希望这对你来说也是公平的。以上是关于Django 中的详细弃用警告的主要内容,如果未能解决你的问题,请参考以下文章