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

时间:2015-08-21 14:00:30

标签: python django logging filtering deprecation-warning

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

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

有没有办法过滤它们?它们在导入过程中被释放。

我们尝试warnings.filterwarnings('ignore', '...'),但在我们致电warnings.filterwarnings()之前会发出警告。

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

1 个答案:

答案 0 :(得分:5)

的QuickFix

要仅在运行manage.py时将其静音,请在import sys之后添加以下这些行:

# ...
import sys

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

# ...

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

# ...
import os
import sys

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

# ...

解释

这是有效的原因是因为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)
    # ...

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

sys.warnoptions添加新元素会强制它评估为True,绕过逻辑。这是无害的,因为当warnings模块加载时它是only used during python startup

RemovedInNextVersionWarning只是RemovedInDjango18Warning in Django 1.7的别名。它设置为RemovedInDjango19Warning in 1.8,对于将来的版本也是如此 - 此代码应该是此类DeprecationWarning的未来证明。

命令行方法

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

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