我们正在将我们的应用程序从Django 1.6更新为1.7。
我们看到了很多这样的消息:RemovedInDjango18Warning
有没有办法过滤它们?它们在导入过程中被释放。
我们尝试warnings.filterwarnings('ignore', '...')
,但在我们致电warnings.filterwarnings()
之前会发出警告。
如何过滤导入期间发生的这些警告?
答案 0 :(得分: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
模块加载时它是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
。