如何抑制Django中的弃用警告?

Bru*_*tus 34 python django django-admin

每次我使用django-admin命令 - 即使在TAB完成时 - 它会抛出一个RemovedInDjango19Warning(如果我使用test命令,则会抛出更多).我怎样才能压制这些警告?

我正在使用Django 1.8和Python 3.4(在虚拟环境中).据我所知,所有这些警告来自库而不是我的代码.

例子

这里有些例子:

  • …/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: django.contrib.contenttypes.generic is deprecated and will be removed in Django 1.9. Its contents have been moved to the fields, forms, and admin submodules of django.contrib.contenttypes. return f(*args, **kwds)

  • …/lib/python3.4/site-packages/django/contrib/admin/util.py:7: RemovedInDjango19Warning: The django.contrib.admin.util module has been renamed. Use django.contrib.admin.utils instead. "Use django.contrib.admin.utils instead.", RemovedInDjango19Warning)

  • …/lib/python3.4/site-packages/django/templatetags/future.py:25: RemovedInDjango19Warning: Loading the ``url`` tag from the ``future`` library is deprecated and will be removed in Django 1.9. Use the default ``url`` tag instead. RemovedInDjango19Warning)

更新

由于Django版本1.11(发行说明),默认情况下不再使用贬值警告.所以我想这不再是一个问题,因为1.11是支持Python 2的最后一个版本,并且还具有长期支持.

Fre*_*fer 30

向settings.py添加日志记录过滤器可以抑制这些控制台警告(至少对于Django 1.7,Python 3.4中的manage.py命令).

过滤器可以选择性地抑制警告.以下代码为控制台创建一个新的"suppress_deprecated"过滤器,并将其附加到默认日志记录过滤器.将此块添加到settings.py以配置LOGGING变量:

import logging, copy
from django.utils.log import DEFAULT_LOGGING

LOGGING = copy.deepcopy(DEFAULT_LOGGING)
LOGGING['filters']['suppress_deprecated'] = {
    '()': 'mysite.settings.SuppressDeprecated'  
}
LOGGING['handlers']['console']['filters'].append('suppress_deprecated')

class SuppressDeprecated(logging.Filter):
    def filter(self, record):
        WARNINGS_TO_SUPPRESS = [
            'RemovedInDjango18Warning',
            'RemovedInDjango19Warning'
        ]
        # Return false to suppress message.
        return not any([warn in record.getMessage() for warn in WARNINGS_TO_SUPPRESS])
Run Code Online (Sandbox Code Playgroud)

如果根网站模块(或过滤器位置和/或名称)不同,则"mysite.settings.SuppressDeprecated"字符串需要更改.

  • @Brutus:`deepcopy`的动机是将`DEFAULT_LOGGING`视为全局常量,以防另一个模块期望`DEFAULT_LOGGING`处于其原始状态.`'()'`字典键指定用户定义的工厂(用于过滤器),这个嵌套字典还可以包括工厂的实例化参数.logging.config模块的Python 3文档的_User定义的objects_部分(在Python 2中登录)提供了有关`'()''键的更多详细信息.django/utils/log.py中的`DEFAULT_LOGGING`定义有助于说明所有内容是如何组合在一起的. (3认同)
  • 如果您配置了日志记录,则此方法是必需的,因为警告模块始终会记录到py.warnings处理程序,即使消息将以"warnings.simplefilter('ignore',DeprecationWarning)"进行过滤. (2认同)

Wil*_*oes 16

我会把它留给新人:

至于django 1.11弃用警告默认不再响亮.python -Wd manage.py runserver例如,要激活它们.

资源


kar*_*ikr 14

在django 1.7中,引入SILENCED_SYSTEM_CHECKS了一个新的设置来抑制警告

您希望永久确认和忽略的系统检查框架(即["models.W001"])生成的消息标识符列表.沉默的警告将不再输出到控制台; 仍会打印出静音错误,但不会阻止管理命令运行.

文档可以在这里找到

以下是要抑制的所有检查的列表 示例:

如果你想抑制TEMPLATES_警告,

Django 1.8中不推荐使用独立的TEMPLATE_*设置

你的设置将是:

SILENCED_SYSTEM_CHECKS = ["1_8.W001"]
Run Code Online (Sandbox Code Playgroud)

  • 唉,这些实际上与Django弃用警告是分开的(由Python的"warnings.py"模块处理). (3认同)

s29*_*s29 11

在manage.py中,将其添加到顶行 -

#!/usr/bin/env PYTHONWARNINGS=ignore python
Run Code Online (Sandbox Code Playgroud)

这将取消所有警告,如果你使用了很多第三方库,我认为在某些情况下这是不可取的.

免责声明:建议仅在您已经看过至少1,000次警告之后,并且应该在升级Django时删除.

注意:这可能会对某些平台产生一些不良影响,例如吞咽更多输出而不仅仅是警告.

  • 您也可以将它作为系统变量添加到`〜/ .profile`或`〜/ .bashrc`中.类似于:`export PYTHONWARNINGS = ignone` (4认同)
  • @sgmart:很好,我不知道'PYTHONWARNINGS`.将它设置在virtualenv postactivate文件或类似的bash设置中可能更安全.获得警告是可以的,只是他们搞乱djangos自动完成... (2认同)

小智 10

django 1.9中没有上述任何内容对我有用.我通过在settings.py中添加以下行来修复此问题:

import logging

def filter_deprecation_warnings(record):
     warnings_to_suppress = [
        'RemovedInDjango110Warning'
    ]

    # Return false to suppress message.
    return not any([warn in record.getMessage() 
         for warn in warnings_to_suppress])

warn_logger = logging.getLogger('py.warnings')
warn_logger.addFilter(filter_deprecation_warnings)
Run Code Online (Sandbox Code Playgroud)


Don*_*ton 8

在查看我的Django 1.8项目的其他依赖项中的弃用警告时,使用

python -Wd manage.py runserver
Run Code Online (Sandbox Code Playgroud)

,我能够通过临时添加来过滤掉Django弃用警告

import warnings
from django.utils.deprecation import RemovedInDjango110Warning
warnings.filterwarnings(action="ignore", category=RemovedInDjango110Warning)
Run Code Online (Sandbox Code Playgroud)

对我来说settings.py(可能是在启动时加载的任何模块中).我无法弄清楚如何将过滤器作为额外-W选项,即

python -Wd -Wi::RemovedInDjango110Warning manage.py runserver
Run Code Online (Sandbox Code Playgroud)

结果Invalid -W option ignored: unknown warning category: 'RemovedInDjango110Warning'.


Mar*_*ian 5

对于仅命令行界面的快速解决方案,请python -W ignore在执行时在 manage.py 前添加前缀,如下所示:

python -W ignore manage.py runserver

-或者-

python -W ignore manage.py shell_plus

-或者-

python -W ignore manage.py makemigrations

这现在对我有用,可以在运行 Django 1.9 时抑制所有 Django 1.10 弃用警告。