我们正在将我们的应用程序从 Django 1.6 更新到 1.7。
我们看到很多这样的信息:RemovedInDjango18Warning
有没有办法过滤它们?它们在导入期间发出。
我们尝试过warnings.filterwarnings('ignore', '...')
,但在我们调用之前会发出警告warnings.filterwarnings()
。
如何过滤导入期间发生的这些警告?
我们正在将我们的应用程序从 Django 1.6 更新到 1.7。
我们看到很多这样的信息:RemovedInDjango18Warning
有没有办法过滤它们?它们在导入期间发出。
我们尝试过warnings.filterwarnings('ignore', '...')
,但在我们调用之前会发出警告warnings.filterwarnings()
。
如何过滤导入期间发生的这些警告?
要仅在您运行时使其静音,请在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
只是RemovedInDjango18Warning
Django 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
。