【问题标题】:Can't silence warnings that django-cms produces无法消除 django-cms 产生的警告
【发布时间】:2015-04-10 01:22:30
【问题描述】:

我使用 djangocms-installer 脚本安装了 Django-cms,除了每次启动服务器、使用 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))

【问题讨论】:

    标签: python django django-cms


    【解决方案1】:

    解决这个问题的外科手术方法是创建一个日志过滤器,它只会过滤掉明确指定为静音的警告。你知道的:

    错误绝不应该悄无声息地过去。
    除非明确静音。


    考虑到这一点,这是我的过滤器机器,全部在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 多个警告,我实际上可以看到来自我自己的代码的警告并修复它。

    【讨论】:

      【解决方案2】:

      这实际上与 Django CMS 无关,尽管您可能会看到 Django CMS 使用的模块发出的警告。

      原因是 Django >= 1.5.x 根据 change 将所有警告路由到日志系统。因此,要在 Django 中禁用警告,您必须为 py.warnings 添加一个记录器(如 Python 的 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']
                }
           },
      }
      

      【讨论】:

      • 不完全是我想要的,但 +1 让我走上了正确的道路。我不想放弃我的代码生成的任何其他警告,例如RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form MyModelForm needs updating
      【解决方案3】:

      您可以使用-W 标志来过滤警告。

      python -W ignore manage.py runserver
      

      【讨论】:

      • 感谢您的建议。这在本地与 runserver 一起工作,但不幸的是,它并不是远程部署的真正选择。另外,我似乎无法指定要静音的确切警告,而是将所有警告全部静音(即使文档另有说明)。我想我在这里也做错了什么:(
      • 是的,我知道答案不是一个完整的解决方案,但希望无论如何它可能会有所帮助。我曾短暂尝试在命令行中指定要过滤的确切警告,但也无法正常工作。
      猜你喜欢
      • 2015-02-06
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 2017-11-15
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多