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
.
@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
Cosa fare per [scrivere il proprio filtro] (https://docs.djangoproject.com/en/1.8/topics/logging/# id5) in settings.py? – danihp
@danhip AFAIK gli avvisi vengono emessi prima che vengano caricati settings.py. Un filtro in settings.py sarebbe troppo tardi. – guettli