【问题标题】:How to filter DeprecationWarnings that happen during importing?如何过滤导入期间发生的 DeprecationWarnings?
【发布时间】:2015-11-15 12:20:05
【问题描述】:

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

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

有没有办法过滤它们?它们会在导入期间发出。

我们尝试了warnings.filterwarnings('ignore', '...'),但在我们调用warnings.filterwarnings() 之前发出了警告。

如何过滤导入过程中出现的这些警告?

【问题讨论】:

  • @Andy。我认为这是一个不同的问题。我知道如何使用warnings.filterwarnings()。我的问题是时机:在导入过程中会发出很多消息。我不知道如何尽早调用 warnings.filterwarnings()
  • settings.py 中的write your own filter 怎么样?
  • @danhip AFAIK 在 settings.py 加载之前发出警告。 settings.py 中的过滤器为时已晚。
  • 您使用的是什么 WSGI 服务器。如果您使用的是 mod_wsgi,那么可以使用 Apache 配置文件中的配置指令来实现。请参阅modwsgi.readthedocs.org/en/develop/release-notes/…中添加的功能中的第 15 项

标签: python django logging filtering deprecation-warning


【解决方案1】:

快速修复

要仅在运行 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启动过程中根据调用python时的-W argument设置的。因此,在使用开发服务器时让警告静音的简单方法是python -W123 manage.py runserver。这不需要修改文件,但会在启动时产生一个无害的警告,因为123 只是一个占位符而不是有效的警告操作。

另一种方式是python -Wi::DeprecationWarning manage.py runserver,尽管这将忽略ALL DeprecationWarnings,包括可能不是RemovedInDjango18Warning 的感兴趣的人。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多