web-dev-qa-db-ja.com

Djangoで非推奨の警告を抑制する方法は?

_Django-admin_コマンドを使用するたびに(TAB完了でも)_RemovedInDjango19Warning_をスローします(testコマンド)。これらの警告を抑制するにはどうすればよいですか?

私はDjango 1.8 with 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 version 1.11( release notes )廃止予定の警告はデフォルトではもはや大きな音ではありません。したがって、これはもはや問題ではないでしょう。サポートするバージョンPython 2および長期サポートも備えています。

33
Brutus

私はこれを新参者に任せます:

Django 1.11に関しては、非推奨の警告はデフォルトで大きな音ではなくなりました。それらを有効にするには、たとえばpython -Wd manage.py runserverを実行します。

ソース

15
Willemoes

Settings.pyにロギングフィルターを追加すると、これらのコンソールの警告を抑制することができます(少なくともDjango 1.7、Python 3.4)のmanage.pyコマンドの場合。

フィルターは警告を選択的に抑制することができます。次のコードは、コンソール用の新しい「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])

ルートWebサイトモジュール(またはフィルターの場所や名前)が異なる場合、「mysite.settings.SuppressDeprecated」文字列を変更する必要があります。

30
Fred Schleifer

Django 1.7)で、警告を抑制する新しい設定がSILENCED_SYSTEM_CHECKSに導入されました

システムチェックフレームワーク(つまり["models.W001"])によって生成されたメッセージの識別子のリスト。永久に確認および無視したい。沈黙した警告はコンソールに出力されなくなります。沈黙したエラーは引き続き出力されますが、管理コマンドの実行は妨げられません。

ドキュメントはここにあります

抑制するすべてのチェックのリスト 例:

TEMPLATES_警告を抑制したい場合は、

スタンドアロンのTEMPLATE_ *設定は、Django 1.8で廃止されました

あなたの設定は次のようになります:

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

Manage.pyで、これを一番上の行に追加します-

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

これにより、すべての警告が抑制されますが、サードパーティのライブラリを多数使用している場合、状況によっては望ましくないことがあります。

免責事項:警告が少なくとも1,000回以上表示されている場合にのみお勧めします。Djangoのアップグレード時に削除する必要があります。

注:これは、一部のプラットフォームで、単なる警告よりも多くの出力を飲み込むなど、望ましくない影響を与える可能性があります。

11
s29

上記のどれも私にとってはうまくいきませんでした、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)
10
Ivan Vigasin

My 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'になりました。

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

何らかの理由で、Fred Schleiferが提供するソリューションは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には、モジュール名から発生した警告の正規表現へのマッピングが含まれています。予想していなかった警告を見たいと思ったため、抑制した警告の種類を非常に具体的にすることを選択しました。個々のサードパーティライブラリが更新されると、関連するエントリを辞書から削除します。

3
Atul Varma

Djangoは、標準のpython warningsモジュールを介して警告を出します。あなたのpythonプロジェクトが警告をスローし、今のところ「許容できる」場合、warnings.filterwarnings()またはwarnings.simplefilter()。これらの「最適な」場所がどこにあるかわかりませんが、common_settings.pyファイルにドロップしました(私にとって、これは変更されず、チェックされています-inファイル、local_settings.pyによってインポートされます)。

例えば:

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

残念ながら、ここではシステムチェックエラーをスローしていないため、システムチェックのサイレンシングに関するコメントは機能しません。

2
Chris Cogdon

このスタンダートDjango script add TAB–completion for you bash- https://github.com/Django/django/blob/master/extras/Django_bash_completion

PYTHONWARNINGSが定義されていません-コンソールのエラー。エクスポートPYTHONWARNINGS = "ignore"を追加し、_Django_completion()でPYTHONWARNINGSを設定解除します

元の機能:

_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
}
2
Forester

現在、Django 1.8を使用するときにこの問題に遭遇します。これらの警告を完全に抑制するのではなく、デバッグモードでのみ表示することにしました。

ロギング設定にコンソールハンドラーを追加し、このハンドラーを使用してpy.warningsをキャッチできます。コードスニペットは次のとおりです。

'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
    },
    ...
}

完全なDjango=設定ファイル: https://github.com/haiwen/seahub/blob/21c827c68047e13700fe102d22a3f5515b22af89/seahub/settings.py#L484

1
xiez

クイックコマンドラインインターフェイスのみのソリューションの場合は、manage.pyの前に次のようにpython -W ignoreを付けて実行します。

python -W ignore manage.py runserver

-or-

python -W ignore manage.py Shell_plus

-or-

python -W ignore manage.py makemigrations

これは、Django 1.9の実行中にDjango 1.10の非推奨警告のすべてを抑制するために、今私のために働いています。

0
Mark Chackerian