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

Python 如何抑制Django中的弃用警告?,python,django,django-admin,Python,Django,Django Admin,每次我使用django admin命令时,即使是在TAB–completion上,它也会抛出一个removedindjango19警告(如果我使用test命令,还会抛出更多)。如何抑制这些警告 我将Django 1.8与Python3.4一起使用(在虚拟环境中)。据我所知,所有这些警告都来自库,而不是我的代码 例子 以下是一些例子: ../lib/python3.4/importlib/_bootstrap.py:321:removedindjango19警告:django.contrib.c

每次我使用
django admin
命令时,即使是在TAB–completion上,它也会抛出一个
removedindjango19警告(如果我使用test命令,还会抛出更多)。如何抑制这些警告

我将Django 1.8与Python3.4一起使用(在虚拟环境中)。据我所知,所有这些警告都来自库,而不是我的代码

例子 以下是一些例子:

  • ../lib/python3.4/importlib/_bootstrap.py:321:removedindjango19警告:django.contrib.contenttypes.generic已弃用,将在django 1.9中删除。其内容已移动到django.contrib.contenttypes的字段、表单和管理子模块。
    返回f(*args,**kwds)

  • ../lib/python3.4/site packages/django/contrib/admin/util.py:7:removedindjango19警告:django.contrib.admin.util模块已重命名。改用django.contrib.admin.utils。
    “改用django.contrib.admin.utils。”,RemovedIndjango19警告)

  • ../lib/python3.4/site packages/django/templatetags/future.py:25:removedindjango19警告:不推荐从“future”库加载“url”标记,将在django 1.9中删除。改为使用默认的``url``标记。
    已删除Indjango19警告)

更新
由于Django版本1.11()默认情况下,弃用警告不再响亮。因此,我想这不再是一个问题,因为1.11是支持Python 2的最后一个版本,并且具有长期支持功能。

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

这将抑制所有警告,我同意,如果您使用大量第三方库,在某些情况下可能不需要这些警告

免责声明:仅在您已经看到警告至少1000次之后才建议使用,并且在升级Django时应将其删除


注意:这在某些平台上可能会产生一些不良影响,例如吞下的输出比警告多。

此standart django脚本添加选项卡–bash的完成-

未定义Python警告-控制台中出现错误。在_django_completion()中添加export PYTHONWARNINGS=“ignore”并取消设置PYTHONWARNINGS

原始功能:

_django_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   DJANGO_AUTO_COMPLETE=1 $1 ) )
}
我的版本。在其他情况下,不要破坏基本行为

_django_completion()
{
    export PYTHONWARNINGS="ignore"
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   DJANGO_AUTO_COMPLETE=1 $1 ) )
    unset PYTHONWARNINGS
}

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

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

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])

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

由于某些原因,Fred Schleifer提供的解决方案在Django 1.9中不适用于我,因此我必须找到不同的解决方案

settings.py
中,我设置了一个自定义函数:

_django_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   DJANGO_AUTO_COMPLETE=1 $1 ) )
}
LOGGING\u CONFIG='my\u project.LOGGING\u utils.configure'
然后我定义了我的自定义
我的\u项目

从logging.config导入dictConfig
进口警告
从django.utils.Depraction导入删除Indjango110Warning
忽略\u DJANGO\u 110\u警告={
#这是第三方库提出的具体警告。
r'rest\u framework\u swagger\.urls:'r'django\.conf\.urls\.patterns\(\)已被弃用。*'
}
def配置(设置):
dictConfig(设置)
对于模块,忽略\u DJANGO\u 110\u警告中的消息。items()
警告。过滤器警告(
“忽略”操作,
类别=删除的INDJANGO110警告,
模块=模块,
消息=消息
)

IGNORE\u DJANGO\u 110\u WARNINGS
dict包含从模块名称到它们发出的警告的正则表达式的映射。我选择了非常具体的警告类型,我抑制,因为我仍然想看到那些我没有预料到的。随着各个第三方库的更新,我将从目录中删除它们的相关条目。

在django 1.7中,引入了一个新的设置
沉默\u系统检查
,以抑制警告

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

这是一个 例如:

如果要取消显示
模板
警告

Django 1.8中不推荐使用独立模板设置

您的设置将是:

SILENCED_SYSTEM_CHECKS = ["1_8.W001"]

以上这些对我都不起作用,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)

Django通过标准python警告模块发出警告。如果您的python项目抛出警告,并且这些警告暂时是“可接受的”,那么只需使用
warnings.filterwarnings()
warnings.simplefilter()
。我不确定这些设置的“最佳”位置在哪里,但我已经将它们放到了我的common_settings.py文件中(对我来说,这是一个不变的签入文件,由local_settings.py导入)

例如:

warnings.filterwarnings(action=“ignore”,category=removedindjango110警告,module='django.template.utils',lineno=37)


唉,在这里,关于禁止系统检查的评论是行不通的,因为您的示例没有抛出系统检查错误。

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

python -Wd manage.py runserver
,我可以通过临时添加

import warnings
from django.utils.deprecation import RemovedInDjango110Warning
warnings.filterwarnings(action="ignore", category=RemovedInDjango110Warning)
到my
settings.py
(可能位于启动时加载的任何模块中)。我想不出如何包括
python -Wd -Wi::RemovedInDjango110Warning manage.py runserver
# in settings.py
import warnings
from django.utils.deprecation import RemovedInDjango20Warning

DEBUG = True

if DEBUG:
    warnings.simplefilter('default')
    warnings.filterwarnings('ignore', category=RemovedInDjango20Warning)
    # use it if you annoyed by DeprecationWarning
    warnings.filterwarnings('ignore', category=DeprecationWarning)
'filters': {
    'require_debug_true': {
        '()': 'django.utils.log.RequireDebugTrue'
    },
    ...
},
'handlers': {
    'console': {
        'level': 'DEBUG',
        'filters': ['require_debug_true'],
        'class': 'logging.StreamHandler',
        'formatter': 'standard',
    },
    ...
},
'loggers': {
    'py.warnings': {
        'handlers': ['console', ],
        'level': 'INFO',
        'propagate': False
    },
    ...
}