Ответ 1
Я оставлю это для новичков:
Что касается django 1.11
, по умолчанию устаревшие предупреждения больше не громкие. Чтобы активировать их, запустите python -Wd manage.py runserver
, например.
Каждый раз, когда я использую команду 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)
Так как версия Django 1.11 (примечания к выпуску), устаревшие предупреждения по умолчанию больше не громкие. Поэтому я предполагаю, что это больше не будет проблемой, так как 1.11 является последней версией для поддержки Python 2, а также имеет долгосрочную поддержку.
Я оставлю это для новичков:
Что касается django 1.11
, по умолчанию устаревшие предупреждения больше не громкие. Чтобы активировать их, запустите python -Wd manage.py runserver
, например.
Добавление фильтра регистрации в 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 'должна изменяться, если корневой веб-модуль (или местоположение фильтра и/или имя) отличается.
В файле manage.py добавьте его в верхнюю строку -
#!/usr/bin/env PYTHONWARNINGS=ignore python
Это приведет к подавлению всех предупреждений, которые, я согласен, в некоторых ситуациях могут быть нежелательными, если вы используете много сторонних библиотек.
Отказ от ответственности: рекомендуется только после того, как вы уже видели предупреждения как минимум 1000 раз уже и должны быть удалены при обновлении Django.
Примечание. Это может иметь некоторые нежелательные эффекты на некоторых платформах, например, проглатывание большего количества выходных данных, чем просто предупреждений.
В django 1.7 была введена новая настройка SILENCED_SYSTEM_CHECKS
для подавления предупреждений
Список идентификаторов сообщений, сгенерированных системой проверки (т.е. [ "models.W001" ]), что вы хотите навсегда признать и проигнорировать. Заблокированные предупреждения больше не будут выводиться на консоль; ошибки молчания все равно будут напечатаны, но не будут предотвращать запуск команд управления.
Документацию можно найти здесь
Вот список всех проверок для подавления. Пример:
Если вы хотите подавить предупреждение TEMPLATES_
,
Отдельные настройки TEMPLATE_ * устарели в Django 1.8
ваши настройки будут следующими:
SILENCED_SYSTEM_CHECKS = ["1_8.W001"]
Ничего из вышеперечисленного не работало для меня, 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)
При просмотре предупреждений об устаревании в других зависимостях моего проекта 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'
.
По какой-то причине решение, предоставленное Фредом Шлейфером, не работало для меня в 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.
Это стандартное 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
}
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)
Увы, комментарий об отключении системных проверок не будет работать, потому что ваш пример не вызывает ошибку системной проверки.
# 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)
Для быстрого решения только для командной строки, 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.