2016-03-31 10 views
2

私は既存のDjangoアプリケーションを1.8から1.9(1.9.4、特に)にアップグレードしています。カスタムロギングハンドラを使用して、サードパーティのメールプロバイダ(SendGrid)から管理エラーメールを送信します。Django 1.9カスタムログハンドラクラス: "ハンドラ 'mail_admins'を設定できません:アプリケーションはまだロードされていません。

runserverコマンドを実行すると、以下のトレースバックが生成されます。ここでは

Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Users/coredev/.virtualenvs/django19/lib/python3.4/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line 
    utility.execute() 
    File "/Users/coredev/.virtualenvs/django19/lib/python3.4/site-packages/django/core/management/__init__.py", line 327, in execute 
    django.setup() 
    File "/Users/coredev/.virtualenvs/django19/lib/python3.4/site-packages/django/__init__.py", line 17, in setup 
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) 
    File "/Users/coredev/.virtualenvs/django19/lib/python3.4/site-packages/django/utils/log.py", line 71, in configure_logging 
    logging_config_func(logging_settings) 
    File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/logging/config.py", line 789, in dictConfig 
    dictConfigClass(config).configure() 
    File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/logging/config.py", line 565, in configure 
    '%r: %s' % (name, e)) 
ValueError: Unable to configure handler 'mail_admins': Apps aren't loaded yet. 

は、カスタムログクラスに関連するコードスニペットです:settings.LOGGINGで

カスタムハンドラ:

'mail_admins': { 
    'level': 'ERROR', 
    'class': 'coredev.utils.logging.SendgridAdminEmailHandler', 
    'filters': ['require_debug_false'], 
    'include_html': True, 
} 

coredev/utils/logging.py

from django.utils.log import AdminEmailHandler 
from coredev.tasks import sendgrid_email 
from settings import ADMINS 

class SendgridAdminEmailHandler(AdminEmailHandler): 

    def send_mail(self, subject, message, *args, **kwargs): 

     for admin in ADMINS: 
      try: 
       if kwargs.get('html_message') is not None: 
        message_content = kwargs['html_message'] 
       else: 
        message_content = message 

       sendgrid_email(admin[1], subject, message_content, message) 
      except: 
       pass 

coredev/tasks.py(関連するスニペットは)

import sendgrid 
from django.conf import settings 

def sendgrid_email(to, subject, body, alt_body, from_email = settings.DEFAULT_FROM_EMAIL, template_id = settings.DEFAULT_TEMPLATE_ID): 

    sg = sendgrid.SendGridClient(settings.EMAIL_HOST_USER, settings.EMAIL_HOST_PASSWORD, raise_errors = True) 
    message = sendgrid.Mail() 

    message.add_filter('templates', 'enable', '1') 
    message.add_filter('templates', 'template_id', template_id) 

    message.add_to(to) 
    message.set_from(from_email) 
    message.set_subject(subject) 
    message.set_html(body) 
    if alt_body: 
     message.set_text(alt_body) 

    sg.send(message) 

私はStackOverflowのとGoogleと同様、Djangoのドキュメント(https://docs.djangoproject.com/en/1.9/topics/logging/)を介して見てきたが、私は見つけることができませんされてきましたまだ解決策はありません。私は、すべてのアプリケーションが「準備完了」になるまで、モデルをインポートすることはできませんが、私はこのコードでモデルをインポートしているとは思わないので、なぜこのエラーが発生しているのかわかりません。

この問題の原因は私のコードのどの部分ですか?私のカスタムロギングハンドラをDjango 1.9のAppRegistryと互換性を持たせるために必要なステップは何ですか?具体的には、私はもはや "アプリケーションはまだロードされていません"エラーを取得するように?

+0

'settings settings import ADMINS'は' settings.py'を読み込もうとしていますか? 'django.confからのインポート設定 '、' settings.ADMINS'を使用する方が良いでしょう。循環インポートを防ぐために、 'send_mail'メソッドの中でその設定のインポートと' coredev.tasks import sendgrid_email'を移動することもできます。 – Alasdair

+0

応答のおかげで、@ Alasdair。私は両方のあなたの提案を試みましたが、残念ながら私はまだ同じエラーが発生しています。 –

答えて

0

私にも同様の問題がありました。私は何か他のものをインポートする前に設定をインポートすることによってそれを解決することができました。また、@ Alasdairのアドバイスを受けてください。

from django.conf import settings 
from django.utils.log import AdminEmailHandler 
from coredev.tasks import sendgrid_email 

class SendgridAdminEmailHandler(AdminEmailHandler): 
    def send_mail(self, subject, message, *args, **kwargs): 
     for admin in settings.ADMINS: 
      try: 
       if kwargs.get('html_message') is not None: 
        message_content = kwargs['html_message'] 
       else: 
        message_content = message 
       sendgrid_email(admin[1], subject, message_content, message) 
      except: 
       pass 
関連する問題