无法消除 django-cms 产生的警告
Can't silence warnings that django-cms produces
我用 djangocms-installer
脚本安装了 Django-cms,除了每次启动服务器时我在 shell 中收到一堆 RemovedInDjango18Warning
警告外,一切正常,用 manage.py 做任何事情,甚至做一个 manage.py 制表符自动完成(最烦人的)!所以我想我会使用 warnings
模块来消除警告:
# in manage.py, just after `import os; import sys`:
import warnings
warnings.filterwarnings("ignore")
我想更具体地了解静音,但事实证明,即使是这个简单的案例也没有做任何事情,警告仍然显示!我做错了什么?!
警告:
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/publisher/manager.py:5: RemovedInDjango18Warning: `PublisherManager.get_query_set` method should be renamed `get_queryset`.
class PublisherManager(models.Manager):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/models/managers.py:15: RemovedInDjango18Warning: `PageManager.get_query_set` method should be renamed `get_queryset`.
class PageManager(PublisherManager):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/admin/change_list.py:39: RemovedInDjango18Warning: `CMSChangeList.get_query_set` method should be renamed `get_queryset`.
class CMSChangeList(ChangeList):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/admin/forms.py:340: RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form PagePermissionInlineAdminForm needs updating
class PagePermissionInlineAdminForm(forms.ModelForm):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/admin/forms.py:442: RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form ViewRestrictionInlineAdminForm needs updating
class ViewRestrictionInlineAdminForm(PagePermissionInlineAdminForm):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/admin/forms.py:491: RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form PageUserForm needs updating
class PageUserForm(UserCreationForm, GenericCmsPermissionForm):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `PagePermissionInlineAdmin.queryset` method should be renamed `get_queryset`.
.__new__(mcs, name, bases, attrs))
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `ViewRestrictionInlineAdmin.queryset` method should be renamed `get_queryset`.
.__new__(mcs, name, bases, attrs))
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `PageUserAdmin.queryset` method should be renamed `get_queryset`.
.__new__(mcs, name, bases, attrs))
您可以使用 -W 标志来过滤警告。
python -W ignore manage.py runserver
这实际上与 Django CMS 无关,尽管您可能会看到 Django CMS 使用的模块发出的警告。
原因是 Django >= 1.5.x 按照此 change. So to disable warnings in Django you have to add a logger for py.warnings
(as documented in Python's warning module):
将所有警告路由到日志系统
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
}
},
'loggers': {
'py.warnings': {
'propagate': False,
'handlers': ['null']
}
},
}
解决这个问题的外科方法是创建一个 日志过滤器,它只会过滤掉明确指定要静音的警告。你知道:
Errors should never pass silently.
Unless explicitly silenced.
考虑到这一点,这是我的过滤机,全部在 settings.py
中(无论如何现在):
MY_IGNORED_WARNINGS = {
'RemovedInDjango18Warning: `PublisherManager.get_query_set`',
'RemovedInDjango18Warning: `PageManager.get_query_set`',
'RemovedInDjango18Warning: `CMSChangeList.get_query_set`',
'form PagePermissionInlineAdminForm needs updating',
'form ViewRestrictionInlineAdminForm needs updating',
'form PageUserForm needs updating',
'/cms/admin/placeholderadmin.py:133: RemovedInDjango18Warning: Options.module_name has been deprecated',
'/cms/admin/settingsadmin.py:28: RemovedInDjango18Warning: Options.module_name has been deprecated',
'/cms/admin/pageadmin.py:111: RemovedInDjango18Warning: Options.module_name has been deprecated',
'RemovedInDjango18Warning: `PagePermissionInlineAdmin.queryset',
'RemovedInDjango18Warning: `ViewRestrictionInlineAdmin.queryset`',
'RemovedInDjango18Warning: `PageUserAdmin.queryset`',
}
def filter_djangocms_warnings(record):
for ignored in MY_IGNORED_WARNINGS:
if ignored in record.args[0]:
return False
return True
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'filters': {
'ignore_djangocms_warnings': {
'()': 'django.utils.log.CallbackFilter',
'callback': filter_djangocms_warnings,
},
},
'loggers': {
'py.warnings': {
'handlers': ['console', ],
'filters': ['ignore_djangocms_warnings', ],
}
},
}
我想它可以进一步完善...有什么想法吗?
何必呢?
首先,我现在(再次)可以使用 django bash autocomplete,而不会在每次按 [tab] 时都出现一堆警告。
另外,现在我没有来自 DjangoCMS 的 20 多个警告,我实际上可以看到哪些警告来自我自己的代码并修复它。
我用 djangocms-installer
脚本安装了 Django-cms,除了每次启动服务器时我在 shell 中收到一堆 RemovedInDjango18Warning
警告外,一切正常,用 manage.py 做任何事情,甚至做一个 manage.py 制表符自动完成(最烦人的)!所以我想我会使用 warnings
模块来消除警告:
# in manage.py, just after `import os; import sys`:
import warnings
warnings.filterwarnings("ignore")
我想更具体地了解静音,但事实证明,即使是这个简单的案例也没有做任何事情,警告仍然显示!我做错了什么?!
警告:
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/publisher/manager.py:5: RemovedInDjango18Warning: `PublisherManager.get_query_set` method should be renamed `get_queryset`.
class PublisherManager(models.Manager):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/models/managers.py:15: RemovedInDjango18Warning: `PageManager.get_query_set` method should be renamed `get_queryset`.
class PageManager(PublisherManager):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/admin/change_list.py:39: RemovedInDjango18Warning: `CMSChangeList.get_query_set` method should be renamed `get_queryset`.
class CMSChangeList(ChangeList):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/admin/forms.py:340: RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form PagePermissionInlineAdminForm needs updating
class PagePermissionInlineAdminForm(forms.ModelForm):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/admin/forms.py:442: RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form ViewRestrictionInlineAdminForm needs updating
class ViewRestrictionInlineAdminForm(PagePermissionInlineAdminForm):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/cms/admin/forms.py:491: RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form PageUserForm needs updating
class PageUserForm(UserCreationForm, GenericCmsPermissionForm):
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `PagePermissionInlineAdmin.queryset` method should be renamed `get_queryset`.
.__new__(mcs, name, bases, attrs))
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `ViewRestrictionInlineAdmin.queryset` method should be renamed `get_queryset`.
.__new__(mcs, name, bases, attrs))
/Users/fran/.virtualenvs/dkde2015/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `PageUserAdmin.queryset` method should be renamed `get_queryset`.
.__new__(mcs, name, bases, attrs))
您可以使用 -W 标志来过滤警告。
python -W ignore manage.py runserver
这实际上与 Django CMS 无关,尽管您可能会看到 Django CMS 使用的模块发出的警告。
原因是 Django >= 1.5.x 按照此 change. So to disable warnings in Django you have to add a logger for py.warnings
(as documented in Python's warning module):
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
}
},
'loggers': {
'py.warnings': {
'propagate': False,
'handlers': ['null']
}
},
}
解决这个问题的外科方法是创建一个 日志过滤器,它只会过滤掉明确指定要静音的警告。你知道:
Errors should never pass silently.
Unless explicitly silenced.
考虑到这一点,这是我的过滤机,全部在 settings.py
中(无论如何现在):
MY_IGNORED_WARNINGS = {
'RemovedInDjango18Warning: `PublisherManager.get_query_set`',
'RemovedInDjango18Warning: `PageManager.get_query_set`',
'RemovedInDjango18Warning: `CMSChangeList.get_query_set`',
'form PagePermissionInlineAdminForm needs updating',
'form ViewRestrictionInlineAdminForm needs updating',
'form PageUserForm needs updating',
'/cms/admin/placeholderadmin.py:133: RemovedInDjango18Warning: Options.module_name has been deprecated',
'/cms/admin/settingsadmin.py:28: RemovedInDjango18Warning: Options.module_name has been deprecated',
'/cms/admin/pageadmin.py:111: RemovedInDjango18Warning: Options.module_name has been deprecated',
'RemovedInDjango18Warning: `PagePermissionInlineAdmin.queryset',
'RemovedInDjango18Warning: `ViewRestrictionInlineAdmin.queryset`',
'RemovedInDjango18Warning: `PageUserAdmin.queryset`',
}
def filter_djangocms_warnings(record):
for ignored in MY_IGNORED_WARNINGS:
if ignored in record.args[0]:
return False
return True
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'filters': {
'ignore_djangocms_warnings': {
'()': 'django.utils.log.CallbackFilter',
'callback': filter_djangocms_warnings,
},
},
'loggers': {
'py.warnings': {
'handlers': ['console', ],
'filters': ['ignore_djangocms_warnings', ],
}
},
}
我想它可以进一步完善...有什么想法吗?
何必呢?
首先,我现在(再次)可以使用 django bash autocomplete,而不会在每次按 [tab] 时都出现一堆警告。
另外,现在我没有来自 DjangoCMS 的 20 多个警告,我实际上可以看到哪些警告来自我自己的代码并修复它。