2016-03-31 2 views
2

Я занимаюсь обновлением существующего приложения Django с 1,8 до 1,9 (в частности, 1.9.4). Я использую собственный обработчик ведения журнала для отправки сообщений электронной почты администратора через сторонний поставщик электронной почты (SendGrid).Django 1.9 Custom Handging Handler Класс: «Невозможно настроить обработчик« 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) 

Я просмотрел документацию Django (https://docs.djangoproject.com/en/1.9/topics/logging/), а также StackOverflow и Google, но я не смог найти решение пока. Я понимаю, что модели не нужно импортировать, пока все приложения не будут «готовы», но я не верю, что я импортирую любые модели в этот код, поэтому я не уверен, почему эта ошибка происходит.

Какая часть моего кода вызывает эту проблему? Какие шаги я должен предпринять, чтобы сделать мой пользовательский обработчик ведения журнала совместимым с Django 1.9 AppRegistry; в частности, чтобы я больше не получил ошибку «Приложения еще не загружены»?

+0

Is 'from settings import ADMINS' пытается загрузить' settings.py'? Лучше использовать 'from django.conf параметры импорта', затем' settings.ADMINS'. Вы также можете попытаться перенести импорт этих параметров и «из coredev.tasks импортировать sendgrid_email» в метод 'send_mail', чтобы предотвратить циклический импорт. – 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 

 Смежные вопросы

  • Нет связанных вопросов^_^