记录和发送电子邮件不适用于Django for 500

use*_*634 5 python email django

我无法登录我的Django Web应用程序.

我的设置文件如下所示:

EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 465
EMAIL_HOST_USER = "paulhtremblay@gmail.com"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = "paulhtremblay@gmail.com"
SERVER_EMAIL = 'smtp.gmail.com'

ADMINS = (
      ('Paul Tremblay', 'paulhtremblay@gmail.com'),
      )

 LOGGING = { 
'version': 1,
'disable_existing_loggers': False,
'handlers': {
    'file': {
        'level': 'ERROR',
        'class': 'logging.FileHandler',
        'filename': '/var/log/django_logs/debug.log'
    },
    'mail_admins': {
     'level': 'ERROR',
       'class': 'django.utils.log.AdminEmailHandler'
               },
},  
'loggers': {
    'django': {
    'handlers': ['file'],
    'level': 'ERROR',
    'propagate': True,
    },
    'django.request': {
    'handlers': ['file'],
    'level': 'ERROR',
    'propagate': True,
    },
},  
 }
Run Code Online (Sandbox Code Playgroud)

我在我的视图文件中有这个:

 def five_hundred_test(request):
   raise ValueError("raising this on purpose for testing for 500")
   return render(request, 'my_test/basic_css.html')
Run Code Online (Sandbox Code Playgroud)

当我将浏览器指向此功能时,我得到500错误(如预期的那样),但没有任何内容被发送到我的电子邮件,并且没有任何内容被放入日志文件中.我使用Django 1.9,使用python3,使用Apache运行服务器.

rar*_*iru 9

这是我的工作设置。我没有添加console logger,因为我仅将它用于生产。灵感来自Django 文档的相关Logging Examples 。

这是我的电子邮件和日志记录设置,这里是电子邮件后端相关 django 文档的链接:

from os.path import join

# Email Configuration ==========================================================
ADMINS = [('Me', 'my@email'), ]
MANAGERS = ADMINS
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = 'My Name To Display <my@email>'
SERVER_EMAIL = 'error_from@email'
EMAIL_HOST = 'smtp.server'  # An IP may work better
EMAIL_HOST_USER = 'username_for_login'
EMAIL_HOST_PASSWORD = 'password_for_login'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

# Logging Configuration ========================================================
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': join(HOME_DIR, 'my_logs', 'debug.log'),
            'formatter': 'verbose'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'simple'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'ERROR',
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

我发现您的环境变量有两个错误:

  • SERVER_EMAIL设置必须是电子邮件地址。
  • 您正在使用TLS,因此正确的端口应该是 587。

此外,您正在尝试使用 Google 作为 SMTP 服务器,但根据此更新的答案, Google 不再提供此服务,您必须搜索另一个 SMTP 服务器。

如果您需要使用,我还整理了一篇文章,其中包含一些调试技术。


mrt*_*rts 7

这可以更简单地完成。如果要同时登录到电子邮件和 Apache 日志文件,则需要在 中执行以下操作settings.py

  1. 配置电子邮件设置 -这确保 Django 可以发送电子邮件

     SERVER_EMAIL = 'me@me.eu'
    
     EMAIL_HOST = 'smtp.me.eu'
     EMAIL_PORT = 587
     EMAIL_USE_TLS = True
     EMAIL_HOST_USER = SERVER_EMAIL
     EMAIL_HOST_PASSWORD = 'password'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置DEBUGFalse-这将启用错误电子邮件发送

     DEBUG = False
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将错误电子邮件接收器添加到ADMINS(您可能也需要MANAGERS)-这指定谁接收错误电子邮件

     ADMINS = (
       ('Me', 'me@me.eu'),
     )
    
     MANAGERS = ADMINS
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后,删除禁用调试模式时不允许消息通过的默认控制台过滤器 -这会使错误最终出现在 Apache 错误日志中

     from django.utils.log import DEFAULT_LOGGING
    
     # Assure that errors end up to Apache error logs via console output
     # when debug mode is disabled
     DEFAULT_LOGGING['handlers']['console']['filters'] = []
    
    Run Code Online (Sandbox Code Playgroud)

    这必须在,settings.py因为DEFAULT_LOGGING在导入设置后将立即配置日志记录。

如果您想从您自己的代码中添加对日志记录的支持,请同时配置根记录器settings.py

# Enable logging to console from our modules by configuring the root logger
DEFAULT_LOGGING['loggers'][''] = {
    'handlers': ['console'],
    'level': 'INFO',
    'propagate': True
}
Run Code Online (Sandbox Code Playgroud)

最后,您可能希望打开详细日志记录:

 SERVER_EMAIL = 'me@me.eu'

 EMAIL_HOST = 'smtp.me.eu'
 EMAIL_PORT = 587
 EMAIL_USE_TLS = True
 EMAIL_HOST_USER = SERVER_EMAIL
 EMAIL_HOST_PASSWORD = 'password'
Run Code Online (Sandbox Code Playgroud)

然后,您可以按如下方式使用它:

log = logging.getLogger(__name__)
log.info('Logging works!')
Run Code Online (Sandbox Code Playgroud)