5

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

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

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

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

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

4

1 回答 1

5

快速解决

要仅在您运行时使其静音,请在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模块加载时在 python 启动期间使用。

RemovedInNextVersionWarning只是RemovedInDjango18WarningDjango 1.7 中的别名。它RemovedInDjango19Warning在 1.8中设置,以此类推用于未来的版本——这段代码应该是这种类型的未来证明DeprecationWarning


命令行方法

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

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

于 2015-08-27T04:45:41.593 回答