web-dev-qa-db-fra.com

Comment supprimer les avertissements de dépréciation dans Django?

Chaque fois que j'utilise la commande Django-admin - même à la fin de TAB - elle lance un RemovedInDjango19Warning (Et bien plus si j'utilise le test commande). Comment puis-je supprimer ces avertissements?

J'utilise Django 1.8 avec Python 3.4 (dans un environnement virtuel). Pour autant que je sache, tous ces avertissements proviennent de bibliothèques pas de mon code.

Exemples

Voici quelques exemples:

  • …/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: Django.contrib.contenttypes.generic is deprecated and will be removed in Django 1.9. Its contents have been moved to the fields, forms, and admin submodules of Django.contrib.contenttypes. return f(*args, **kwds)

  • …/lib/python3.4/site-packages/Django/contrib/admin/util.py:7: RemovedInDjango19Warning: The Django.contrib.admin.util module has been renamed. Use Django.contrib.admin.utils instead. "Use Django.contrib.admin.utils instead.", RemovedInDjango19Warning)

  • …/lib/python3.4/site-packages/Django/templatetags/future.py:25: RemovedInDjango19Warning: Loading the ``url`` tag from the ``future`` library is deprecated and will be removed in Django 1.9. Use the default ``url`` tag instead. RemovedInDjango19Warning)

Mise à jour

Depuis Django version 1.11 ( notes de version ) les avertissements de dépréciation ne sont plus bruyants par défaut. Donc je suppose que ce ne sera plus un problème, puisque 1.11 est le dernier version à prendre en charge Python 2 et propose également une prise en charge à long terme.

33
Brutus

Je laisse cela aux nouveaux arrivants:

Pour ce qui est de Django 1.11 les avertissements de dépréciation ne sont plus bruyants par défaut. Pour les activer, exécutez python -Wd manage.py runserver par exemple.

source

15
Willemoes

L'ajout d'un filtre de journalisation à settings.py peut supprimer ces avertissements de la console (au moins pour les commandes manage.py dans Django 1.7, Python 3.4).

Un filtre peut supprimer sélectivement les avertissements. Le code suivant crée un nouveau filtre "suppress_deprecated" pour la console et l'ajoute aux filtres de journalisation par défaut. Ajoutez ce bloc à settings.py pour configurer la variable LOGGING:

import logging, copy
from Django.utils.log import DEFAULT_LOGGING

LOGGING = copy.deepcopy(DEFAULT_LOGGING)
LOGGING['filters']['suppress_deprecated'] = {
    '()': 'mysite.settings.SuppressDeprecated'  
}
LOGGING['handlers']['console']['filters'].append('suppress_deprecated')

class SuppressDeprecated(logging.Filter):
    def filter(self, record):
        WARNINGS_TO_SUPPRESS = [
            'RemovedInDjango18Warning',
            'RemovedInDjango19Warning'
        ]
        # Return false to suppress message.
        return not any([warn in record.getMessage() for warn in WARNINGS_TO_SUPPRESS])

La chaîne 'mysite.settings.SuppressDeprecated' doit changer si le module du site Web racine (ou l'emplacement et/ou le nom du filtre) est différent.

30
Fred Schleifer

Dans Django 1.7, un nouveau paramètre a été introduit SILENCED_SYSTEM_CHECKS pour supprimer les avertissements

Une liste d'identifiants de messages générés par l'infrastructure de vérification du système (c'est-à-dire ["models.W001"]) que vous souhaitez accuser réception et ignorer de façon permanente. Les avertissements réduits au silence ne seront plus émis vers la console; les erreurs réduites au silence seront toujours imprimées, mais n'empêcheront pas l'exécution des commandes de gestion.

La documentation peut être trouvée ici

Voici un liste de toutes les vérifications à supprimer Exemple:

Si vous souhaitez supprimer le TEMPLATES_ avertissement,

Les paramètres autonomes TEMPLATE_ * ont été déconseillés dans Django 1.8

vos paramètres seraient:

SILENCED_SYSTEM_CHECKS = ["1_8.W001"]
14
karthikr

Dans manage.py, ajoutez ceci à la ligne supérieure -

#!/usr/bin/env PYTHONWARNINGS=ignore python

Cela supprimera tous les avertissements, ce qui, je le reconnais, peut dans certaines situations être indésirable si vous utilisez beaucoup de bibliothèques tierces.

Avis de non-responsabilité: recommandé uniquement après avoir déjà vu les avertissements au moins 1 000 fois trop, et doit être supprimé lorsque vous mettez à niveau Django.

Remarque: cela peut avoir des effets indésirables sur certaines plates-formes, par exemple en avalant plus de sortie que de simples avertissements.

11
s29

Rien de ce qui précède n'a fonctionné pour moi, Django 1.9. J'ai corrigé cela en ajoutant les lignes suivantes à settings.py:

import logging

def filter_deprecation_warnings(record):
     warnings_to_suppress = [
        'RemovedInDjango110Warning'
    ]

    # Return false to suppress message.
    return not any([warn in record.getMessage() 
         for warn in warnings_to_suppress])

warn_logger = logging.getLogger('py.warnings')
warn_logger.addFilter(filter_deprecation_warnings)
10
Ivan Vigasin

Lors de l'examen des avertissements de dépréciation dans d'autres dépendances de mon projet Django 1.8, en utilisant

python -Wd manage.py runserver

, J'ai pu filtrer les Django avertissements de dépréciation en ajoutant temporairement

import warnings
from Django.utils.deprecation import RemovedInDjango110Warning
warnings.filterwarnings(action="ignore", category=RemovedInDjango110Warning)

à mon settings.py (peut probablement être dans n'importe quel module chargé au démarrage). Je n'arrivais pas à comprendre comment inclure le filtre en tant que _ -W option, c'est-à-dire.

python -Wd -Wi::RemovedInDjango110Warning manage.py runserver

a entraîné Invalid -W option ignored: unknown warning category: 'RemovedInDjango110Warning'.

8
Donny Winston
# in settings.py
import warnings
from Django.utils.deprecation import RemovedInDjango20Warning

DEBUG = True

if DEBUG:
    warnings.simplefilter('default')
    warnings.filterwarnings('ignore', category=RemovedInDjango20Warning)
    # use it if you annoyed by DeprecationWarning
    warnings.filterwarnings('ignore', category=DeprecationWarning)
3
madjardi

Pour une raison quelconque, la solution fournie par Fred Schleifer ne fonctionnait pas pour moi dans Django 1.9, j'ai donc dû trouver une solution différente.

Dans _settings.py_, j'ai configuré une fonction personnalisée _LOGGING_CONFIG_ :

_LOGGING_CONFIG = 'my_project.logging_utils.configure'
_

Ensuite, j'ai défini mon module _my_project.logging_utils_ personnalisé comme suit:

_from logging.config import dictConfig
import warnings
from Django.utils.deprecation import RemovedInDjango110Warning

IGNORE_Django_110_WARNINGS = {
    # This is a specific warning raised by a third-party library.
    r'rest_framework_swagger\.urls': r'Django\.conf\.urls\.patterns\(\) is deprecated.*'
}

def configure(settings):
    dictConfig(settings)
    for module, message in IGNORE_Django_110_WARNINGS.items():
        warnings.filterwarnings(
            action='ignore',
            category=RemovedInDjango110Warning,
            module=module,
            message=message
        )
_

Le _IGNORE_Django_110_WARNINGS_ dict contient un mappage des noms de module aux expressions régulières des avertissements qu'ils génèrent. J'ai choisi d'être très précis dans les types d'avertissements que j'ai supprimés, car je voulais toujours voir ceux auxquels je ne m'attendais pas. Au fur et à mesure que les bibliothèques tierces sont mises à jour, je vais supprimer leurs entrées associées du dict.

3
Atul Varma

Django place les avertissements via le module standard python avertissements. Si votre projet python lève des avertissements et qu'ils sont "acceptables" pour le moment, utilisez simplement la fonction warnings.filterwarnings() ou warnings.simplefilter(). Je ne sais pas où est le "meilleur" endroit pour ceux-ci, mais je les ai déposés dans mon fichier common_settings.py (pour moi, il s'agit d'un -in, qui est importé par local_settings.py).

Par exemple:

warnings.filterwarnings(action="ignore", category=RemovedInDjango110Warning, module='Django.template.utils', lineno=37)

Hélas, le commentaire sur la désactivation des vérifications du système ne fonctionnera pas ici, car votre exemple ne génère pas d'erreur de vérification du système.

2
Chris Cogdon

Ce standart Django script ajoute TAB – complétion pour vous bash - https://github.com/Django/django/blob/master/extras/Django_bash_completion

PYTHONWARNINGS n'est pas défini - erreur dans la console. Ajouter l'exportation PYTHONWARNINGS = "ignorer" et désactiver PYTHONWARNINGS dans _Django_completion ()

Fonction d'origine:

_Django_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   Django_AUTO_COMPLETE=1 $1 ) )
}

Ma version. Ne cassez pas le comportement de base dans d'autres cas.

_Django_completion()
{
    export PYTHONWARNINGS="ignore"
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   Django_AUTO_COMPLETE=1 $1 ) )
    unset PYTHONWARNINGS
}
2
Forester

Je rencontre actuellement ce même problème lorsque j'utilise Django 1.8. Au lieu de supprimer complètement ces avertissements, nous décidons de les afficher uniquement en mode DEBUG.

Nous pouvons ajouter un gestionnaire de console dans les paramètres de journalisation et utiliser ce gestionnaire pour attraper py.warnings. Voici l'extrait de code,

'filters': {
    'require_debug_true': {
        '()': 'Django.utils.log.RequireDebugTrue'
    },
    ...
},
'handlers': {
    'console': {
        'level': 'DEBUG',
        'filters': ['require_debug_true'],
        'class': 'logging.StreamHandler',
        'formatter': 'standard',
    },
    ...
},
'loggers': {
    'py.warnings': {
        'handlers': ['console', ],
        'level': 'INFO',
        'propagate': False
    },
    ...
}

Le fichier de paramètres Django: https://github.com/haiwen/seahub/blob/21c827c68047e13700fe102d22a3f5515b22af89/seahub/settings.py#L484

1
xiez

Pour une solution d'interface de ligne de commande rapide uniquement, faites précéder manage.py avec python -W ignore lors de l'exécution, comme dans:

python -W ignore manage.py runserver

- ou -

python -W ignore manage.py Shell_plus

- ou -

python -W ignore manage.py makemigrations

Cela fonctionne pour moi maintenant, pour supprimer tous les avertissements de désapprobation Django 1.10 lors de l'exécution de Django 1.9.

0
Mark Chackerian