Подтвердить что ты не робот

Как подавить предупреждения об устаревании в Django?

Каждый раз, когда я использую команду django-admin - даже при завершении TAB - она ​​выдает RemovedInDjango19Warning (и многое другое, если я использую тестовую команду). Как я могу подавить эти предупреждения?

Я использую Django 1.8 с Python 3.4 (в виртуальной среде). Насколько я могу судить, все эти предупреждения поступают из библиотек не из моего кода.

Примеры

Вот несколько примеров:

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

Update

Так как версия Django 1.11 (примечания к выпуску), устаревшие предупреждения по умолчанию больше не громкие. Поэтому я предполагаю, что это больше не будет проблемой, так как 1.11 является последней версией для поддержки Python 2, а также имеет долгосрочную поддержку.

4b9b3361

Ответ 1

Я оставлю это для новичков:

Что касается django 1.11, по умолчанию устаревшие предупреждения больше не громкие. Чтобы активировать их, запустите python -Wd manage.py runserver, например.

источник

Ответ 2

Добавление фильтра регистрации в settings.py может подавить эти предупреждения консоли (по крайней мере для команд manage.py в Django 1.7, Python 3.4).

Фильтр может выборочно подавлять предупреждения. Следующий код создает новый фильтр "suppress_deprecated" для консоли и добавляет его к фильтрам регистрации по умолчанию. Добавьте этот блок в settings.py, чтобы настроить переменную 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])

Строка `mysite.settings.SuppressDeprecated 'должна изменяться, если корневой веб-модуль (или местоположение фильтра и/или имя) отличается.

Ответ 3

В файле manage.py добавьте его в верхнюю строку -

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

Это приведет к подавлению всех предупреждений, которые, я согласен, в некоторых ситуациях могут быть нежелательными, если вы используете много сторонних библиотек.

Отказ от ответственности: рекомендуется только после того, как вы уже видели предупреждения как минимум 1000 раз уже и должны быть удалены при обновлении Django.

Примечание. Это может иметь некоторые нежелательные эффекты на некоторых платформах, например, проглатывание большего количества выходных данных, чем просто предупреждений.

Ответ 4

В django 1.7 была введена новая настройка SILENCED_SYSTEM_CHECKS для подавления предупреждений

Список идентификаторов сообщений, сгенерированных системой проверки (т.е. [ "models.W001" ]), что вы хотите навсегда признать и проигнорировать. Заблокированные предупреждения больше не будут выводиться на консоль; ошибки молчания все равно будут напечатаны, но не будут предотвращать запуск команд управления.

Документацию можно найти здесь

Вот список всех проверок для подавления. Пример:

Если вы хотите подавить предупреждение TEMPLATES_,

Отдельные настройки TEMPLATE_ * устарели в Django 1.8

ваши настройки будут следующими:

SILENCED_SYSTEM_CHECKS = ["1_8.W001"]

Ответ 5

Ничего из вышеперечисленного не работало для меня, django 1.9. Я исправил это, добавив следующие строки в 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)

Ответ 6

При просмотре предупреждений об устаревании в других зависимостях моего проекта Django 1.8, используя

python -Wd manage.py runserver

я смог отфильтровать предупреждения об отказе от Django, временно добавив

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

к моему settings.py (возможно, он может быть в любом модуле, загруженном при запуске). Я не мог понять, как включить фильтр в качестве дополнительной опции -W, т.е.

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

привело к Invalid -W option ignored: unknown warning category: 'RemovedInDjango110Warning'.

Ответ 7

По какой-то причине решение, предоставленное Фредом Шлейфером, не работало для меня в Django 1.9, поэтому мне пришлось найти другое решение.

В settings.py, я создал пользовательскую LOGGING_CONFIG:

LOGGING_CONFIG = 'my_project.logging_utils.configure'

Затем я определил свой собственный my_project.logging_utils модуль следующим образом:

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
        )

IGNORE_DJANGO_110_WARNINGS dict содержит отображение из имен модулей в регулярные выражения предупреждений, поднятых ими. Я решил быть очень конкретным в тех предостережениях, которые я подавил, поскольку я все еще хотел видеть те, которых я не ожидал. По мере обновления отдельных сторонних библиотек я удаляю связанные записи из dict.

Ответ 8

Это стандартное django script добавляет TAB-завершение для вас bash - https://github.com/django/django/blob/master/extras/django_bash_completion

PYTHONWARNINGS не определен - ошибка в консоли. Добавить экспорт PYTHONWARNINGS = "игнорировать" и отключить PYTHONWARNINGS в _django_completion()

Функция оригинала:

_django_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   DJANGO_AUTO_COMPLETE=1 $1 ) )
}

Моя версия. Не нарушайте основное поведение в других случаях.

_django_completion()
{
    export PYTHONWARNINGS="ignore"
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   DJANGO_AUTO_COMPLETE=1 $1 ) )
    unset PYTHONWARNINGS
}

Ответ 9

Django помещает предупреждения через стандартный модуль предупреждений python. Если ваш проект python выдает предупреждения, и они являются "приемлемыми" на данный момент, просто используйте warnings.filterwarnings() или warnings.simplefilter(). Я не уверен, где "лучшее" место для них, но я поместил их в свой файл common_settings.py(для меня это неизменный, зарегистрированный файл, который импортируется local_settings.py).

Например:

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

Увы, комментарий об отключении системных проверок не будет работать, потому что ваш пример не вызывает ошибку системной проверки.

Ответ 10

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

Ответ 11

Для быстрого решения только для командной строки, preface manage.py с python -W ignore при выполнении, как в:

python -W ignore manage.py runserver

-или -

python -W ignore manage.py shell_plus

-или -

python -W ignore manage.py makemigrations

Теперь это работает для меня, чтобы отключить все предупреждения об отключении Django 1.10 во время запуска Django 1.9.