2015-02-10 11 views
5

Ho installato Django-cms con lo script djangocms-installer e tutto funziona bene, tranne che ricevo un mucchio di avvertimenti RemovedInDjango18Warning nella shell ogni volta che avvio il server, faccio qualcosa con gestisci .py, o anche fare una scheda di gestione.py-completamento automatico (più fastidioso)! Così ho pensato di mettere a tacere le avvertenze, utilizzando warnings modulo:Impossibile tacitare gli avvisi che produce django-cms

# in manage.py, just after `import os; import sys`: 
import warnings 
warnings.filterwarnings("ignore") 

Vorrei ottenere più specifico con il silenziamento, ma si scopre che anche questo semplice caso non fa nulla, vengono comunque visualizzati gli avvertimenti ! Che cosa sto facendo di sbagliato?!

Gli avvertimenti:

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

risposta

7

Il modo chirurgico per risolvere questo è quello di creare un filtro registrazione che filtrerà solo avvertimenti che sono esplicitamente specificati per essere messi a tacere. Sai:

Gli errori non dovrebbero mai passare in silenzio.
Salvo esplicitamente tacere.


Con questo in mente, ecco la mia macchina filtro, il tutto in settings.py (per ora comunque):

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', ], 
     } 
    }, 
} 

immagino che può essere ulteriormente raffinato ... tutte le idee?


Perché preoccuparsi?

Per uno, ora è possibile utilizzare (di nuovo) django bash autocomplete senza che vengano emessi un richiamo di avvisi ogni volta che si preme [tab].

Inoltre, ora che non ho più 20 avvisi di DjangoCMS, posso effettivamente vedere quali avvisi provengono dal mio codice e risolverlo.

1

È possibile utilizzare il flag -W per filtrare gli avvertimenti.

+0

Grazie per il suggerimento. Funziona localmente con runserver, ma sfortunatamente non è davvero un'opzione per le installazioni remote. Inoltre, non riesco a specificare gli avvisi esatti che voglio mettere a tacere, invece li zittisce tutti (anche se i documenti dicono il contrario). Suppongo che stia facendo qualcosa di sbagliato anche qui :( – frnhr

+0

Sì, so che la risposta non è una soluzione completa, ma spero che possa essere utile comunque. Ho provato brevemente a specificare gli avvertimenti esatti da filtrare nella riga di comando, ma – Alasdair

3

Questo in realtà non è correlato a Django CMS, anche se è possibile visualizzare gli avvisi emessi da un modulo utilizzato da Django CMS.

Il motivo è che Django> = 1.5.x indirizza tutti gli avvisi al sistema di registrazione come da questo change. Quindi, per disabilitare gli avvisi in Django si deve aggiungere un logger per py.warnings (come documentato nel warning module di Python):

# settings.py 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'null': { 
      'level': 'DEBUG', 
      'class': 'logging.NullHandler', 
     } 
    }, 
    'loggers': { 
     'py.warnings': { 
      'propagate': False, 
      'handlers': ['null'] 
      } 
    }, 
} 
+0

Non esattamente quello che stavo cercando, ma +1 per avermi impostato sulla strada giusta. Non voglio perdere altri avvisi che il mio codice genera, ad es.'RemovedInDjango18Warning: la creazione di un ModelForm senza l'attributo 'fields' o l''' exclude 'è deprecato - modulo MyModelForm ha bisogno di essere aggiornato' – frnhr