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)
到mysettings.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
},
...
}