2015-08-21 14 views
5

Stiamo aggiornando la nostra applicazione da Django 1.6 a 1.7.Come filtrare i DeprecationAvvertimenti che si verificano durante l'importazione?

vediamo un sacco di questi messaggi: RemovedInDjango18Warning

C'è un modo per filtrare loro? Vengono emessi durante l'importazione.

Abbiamo provato warnings.filterwarnings('ignore', '...') ma gli avvisi vengono emessi prima di chiamare warnings.filterwarnings().

Come posso filtrare questi avvisi che si verificano durante l'importazione?

+0

@Andy. Penso che questa sia una domanda diversa. So come usare 'warnings.filterwarnings()'. Il mio problema è il momento: molti messaggi vengono emessi durante l'importazione. Non so come chiamare warnings.filterwarnings() abbastanza presto – guettli

+0

Cosa fare per [scrivere il proprio filtro] (https://docs.djangoproject.com/en/1.8/topics/logging/# id5) in settings.py? – danihp

+0

@danhip AFAIK gli avvisi vengono emessi prima che vengano caricati settings.py. Un filtro in settings.py sarebbe troppo tardi. – guettli

risposta

4

Quickfix

a tacere solo quando si esegue manage.py, aggiungere queste righe dopo import sys:

# ... 
import sys 

if not sys.warnoptions: 
    sys.warnoptions += [None] 

# ... 

Se anche voi volete tacere dal server WSGI (cioè Apache), aggiornare your_project/wsgi.py e aggiungere le seguenti righe dopo import os:

# ... 
import os 
import sys 

if not sys.warnoptions: 
    sys.warnoptions += [None] 

# ... 

Spiegazione

Il motivo per cui funziona è a causa di come django.utils.log.configure_logging() gestisce:

def configure_logging(logging_config, logging_settings): 
    if not sys.warnoptions: 
     # Route warnings through python logging 
     logging.captureWarnings(True) 
     # RemovedInNextVersionWarning is a subclass of DeprecationWarning which 
     # is hidden by default, hence we force the "default" behavior 
     warnings.simplefilter("default", RemovedInNextVersionWarning) 
    # ... 

Si volutamente chiamato nelle prime fasi del processo di avvio come parte di django.setup(), il che spiega il motivo per cui gli errori sono stati emessi prima che tu fossi in grado di zittirli ancora più in basso.

L'aggiunta di un nuovo elemento a sys.warnoptions obbliga a valutare su True, ignorando la logica. Questo è innocuo dal momento che è only used during python startup quando caricato dal modulo warnings.

RemovedInNextVersionWarning è solo uno pseudonimo per RemovedInDjango18Warning in Django 1.7. È impostato su RemovedInDjango19Warning in 1.8 e così via per le versioni future: questo codice dovrebbe essere a prova di futuro per questo tipo di DeprecationWarning.


metodi della riga di comando

noti che sys.warnoptions è normalmente impostata durante l'avvio di pitone in base alla -W argument quando si chiama Python. Pertanto, un modo semplice per silenziare gli avvisi quando si utilizza il server di sviluppo è python -W123 manage.py runserver. Ciò non richiede alcuna modifica dei file, ma comporta un avvertimento univoco all'avvio poiché 123 è solo un segnaposto e non un'azione di avviso valida.

Un altro modo è python -Wi::DeprecationWarning manage.py runserver, anche se questo ignorerà TUTTIDeprecationWarning s, tra cui, eventualmente, quelli di interesse che non sono RemovedInDjango18Warning.

Problemi correlati