如何过滤导入期间发生的DeprecationWarnings?

gue*_*tli 5 python django logging filtering deprecation-warning

我们正在将我们的应用程序从Django 1.6更新到1.7.

我们看到很多这样的信息:RemovedInDjango18Warning

有没有办法过滤它们?它们在导入期间被释放.

我们尝试了,warnings.filterwarnings('ignore', '...')但是在我们打电话之前警告会被发出warnings.filterwarnings().

如何过滤导入期间发生的这些警告?

use*_*130 5

快速解决

要仅在运行时使其静音manage.py,请在以下后面添加以下行import sys:

# ...
import sys

if not sys.warnoptions:
    sys.warnoptions += [None]

# ...
Run Code Online (Sandbox Code Playgroud)

如果您还想从WSGI服务器(即Apache)your_project/wsgi.py中将其静音,请在以下行之后更新并添加以下行import os:

# ...
import os
import sys

if not sys.warnoptions:
    sys.warnoptions += [None]

# ...
Run Code Online (Sandbox Code Playgroud)

说明

这是有效的原因是因为django.utils.log.configure_logging()处理它:

def configure_logging(logging_config, logging_settings):
    if not sys.warnoptions:
        # Route warnings through python logging
        logging.captureWarnings(True)
        # RemovedInNextVersionWarning is a subclass of DeprecationWarning which
        # is hidden by default, hence we force the "default" behavior
        warnings.simplefilter("default", RemovedInNextVersionWarning)
    # ...
Run Code Online (Sandbox Code Playgroud)

故意在启动过程的早期调用它作为其中的一部分django.setup(),这解释了为什么在你能够在堆栈中进一步沉默之前发出错误.

添加一个新元素以sys.warnoptions强制它评估True,绕过逻辑.这是无害的,因为它仅在python启动时由warnings模块加载时使用.

RemovedInNextVersionWarning只是RemovedInDjango18WarningDjango 1.7的别名.它被设置为RemovedInDjango19Warning1.8,对于将来的版本等等 - 这段代码应该是这种类型的未来证明DeprecationWarning.


命令行方法

注意,sys.warnoptions通常在python启动期间根据调用python时的-W参数设置.因此,在使用开发服务器时,只需使警告静音的简单方法就是python -W123 manage.py runserver.这不需要修改文件,但在启动时会导致单个无害警告,因为123它只是一个占位符而不是有效的警告操作.

另一种方式是python -Wi::DeprecationWarning manage.py runserver,虽然这会忽略所有 DeprecationWarning的,包括可能不感兴趣的RemovedInDjango18Warning.