动态settings.py

Baz*_*nga 6 python django

我使用django-constance作为库.虽然我注意到的一件事是当我尝试使用ADMIN和时MANAGER

CONSTANCE_CONFIG = {
'ADMINS': ([('Errors', 'admin@gmail.com')], 'Admin Emails'),
}
Run Code Online (Sandbox Code Playgroud)

发送电子邮件不起作用.

在MANAGER中我试过这个:

MANAGER = CONSTANCE_CONFIG['ADMINS'][0]
Run Code Online (Sandbox Code Playgroud)

仍然发送电子邮件不起作用.我错过了错误的实现吗?或者你可以建议任何其他可以覆盖ADMINMANAGER进入的库settings.py.我正在使用Django 1.8.5和Python 3.

当尝试导入settings.py内部时,它也会产生错误.

Sat*_*eet 5

1# 可能你已经知道,django-constance不支持元组。基本上,特别是在您的情况下,很难检测到元组的小部件。ADMINS 可以是这样的,你怎么可能通过..!!(想想所有 django 小部件)added/deleted使其变得动态。single widget所以这里 CONSTANCE_ADDITIONAL_FIELDS也行不通。

2#我认为您误解了 django constance 的工作。它不会刷新您的django server. 所以MANAGER = CONSTANCE_CONFIG['ADMINS'][0]是完全错误的(即使使用CONSTANCE_ADDITIONAL_FIELDS)。您在这里访问constant值(不是动态的)。你需要像这样访问它

from constance import config
print(config.ADMINS)
Run Code Online (Sandbox Code Playgroud)

3#默认日志记录配置使用AdminEmailHandlerfor 类mail_admins,该类使用ADMINS来自 的值django settings,而不是constance config

因此,一种可能的解决方案可能是创建您自己的handler类,该类将ADMINS使用constance config. 所以将你的更改setting.py

CONSTANCE_CONFIG = {
    'ADMIN1': ('admin@gmail.com', 'This one will receive error on 500'),
} # you can add as many admins as you want with ADMIN1, ADMIN2 etc(no tuple) 
Run Code Online (Sandbox Code Playgroud)

然后创建您自己的处理程序类,它将使用CONSTANCE_CONFIG.

from django.utils.log import AdminEmailHandler
from constance import config
from django.conf import settings
from django.core.mail.message import EmailMultiAlternatives


class ConstanceEmailHandler(AdminEmailHandler):
    def send_mail(self, subject, message, html_message=None, fail_silently=False, *args, **kwargs):
        # create a list of ADMIN emails here, if you have more then one ADMIN
        mail = EmailMultiAlternatives('%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject),
                                  message, settings.SERVER_EMAIL, [config.ADMIN1],
                                  connection=self.connection())
        if html_message:
            mail.attach_alternative(html_message, 'text/html')
        mail.send(fail_silently=fail_silently)
Run Code Online (Sandbox Code Playgroud)

然后更改您的LOGGER配置。django.utils.log如果您没有自定义设置,我建议您从 (DEFAULT_LOGGING) 复制默认记录器LOGGING配置。并更改mail_admins

'mail_admins': {
    'level': 'ERROR',
    'filters': ['require_debug_false'], # change it to require_debug_true if you want to test it locally.
    'class': '<yourproject>.<yourfile>.ConstanceEmailHandler', # path to newly created handler class
    'include_html': True
    },
Run Code Online (Sandbox Code Playgroud)