【问题标题】:Django doesn't email reporting an internal server error (HTTP status code 500)Django 不会通过电子邮件报告内部服务器错误(HTTP 状态代码 500)
【发布时间】:2017-05-12 20:17:17
【问题描述】:

我可以使用以下代码发送邮件

E:\Python\django-test\LYYDownloaderServer>python manage.py shell

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.mail import send_mail
>>>
>>> send_mail(
...     'Subject here',
...     'Here is the message.',
...     'redstone-cold@163.com',
...     ['2281570025@qq.com'],
...     fail_silently=False,
... )
1
>>> 

根据doc

当 DEBUG 为 False 时,Django 将通过电子邮件发送给 ADMINS 中列出的用户 每当您的代码引发未处理的异常和结果时设置 内部服务器错误(HTTP 状态代码 500)。这给出了 管理员立即通知任何错误。管理员将 获取错误描述、完整的 Python 回溯,以及 有关导致错误的 HTTP 请求的详细信息。

但在我的情况下,Django 不会通过电子邮件报告内部服务器错误(HTTP 状态代码 500)

有什么问题?请帮忙解决问题

settings.py

"""
Django settings for LYYDownloaderServer project.

Generated by 'django-admin startproject' using Django 1.9.1.

For more information on this file, see
https://docs.djangoproject.com/en/1.9/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.9/ref/settings/
"""

import os
ADMINS = [('Philip', 'r234327894@163.com'), ('Philip2', '768799875@qq.com')]
EMAIL_HOST = 'smtp.163.com'  # 'localhost'#'smtp.139.com'
# EMAIL_PORT = 25
# EMAIL_USE_TLS = True

EMAIL_HOST_USER = 'r234327894@163.com'  # '13529123633@139.com'
EMAIL_HOST_PASSWORD = '******'
# DEFAULT_FROM_EMAIL = 'r234327894@163.com'
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 's4(z8qzt$=x(2t(ok5bb58_!u==+x97t0vpa=*8bb_68baekkh'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['127.0.0.1']#, '.0letter.com'


# Application definition

INSTALLED_APPS = [
    'VideoParser.apps.VideoparserConfig',
    'FileHost.apps.FilehostConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE_CLASSES = [
    'django.middleware.common.BrokenLinkEmailsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'LYYDownloaderServer.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'LYYDownloaderServer.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.9/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/

STATIC_URL = '/static/'

views.py 的开头

from django.http import JsonResponse, HttpResponse
import logging
import m3u8
import os
from VideoParser.parsers.CommonParsers import *
import urllib.parse
import hashlib
from datetime import datetime, timedelta, date
from django.views.decorators.csrf import csrf_exempt
from django.db import IntegrityError
from VideoParser.models import *
from importlib import import_module
# print('-------------views --------')
FILES_DIR = 'files'

# specialHostName2module = {'56': 'v56'}
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d %I:%M:%S %p', level=logging.ERROR, handlers=[logging.handlers.RotatingFileHandler(filename=os.path.join(FILES_DIR, 'LYYDownloaderServer.log'), maxBytes=1024 * 1024, backupCount=1)])
...

【问题讨论】:

  • 在设置中设置DEBUG = True查看回溯是什么

标签: python django python-3.x


【解决方案1】:

首先,您是否能够使用控制台发送邮件并不重要,重要的是您是否收到了邮件。我假设你做到了。

其次,最好在控制台中使用与ADMINS 中设置的电子邮件地址完全相同的电子邮件地址,以确保安全。

最后,发件人地址也可能很重要。默认为“root@localhost”,“root”可以,“localhost”不可以,某些邮件服务器可能会拒绝该邮件。通过设置SERVER_EMAIL Django 设置来指定另一个发件人电子邮件地址。

【讨论】:

【解决方案2】:

Djano 使用日志系统发送错误的管理员电子邮件。

从您的views.py 可以看出,您正在更改日志记录设置。 这可能是问题的原因,因为您清除了 django 管理处理程序 mail_admins

更多信息请查看django documentation

【讨论】:

    【解决方案3】:

    Django doc 说:为了发送电子邮件,至少需要 EMAIL_HOST、EMAIL_HOST_USER 和 EMAIL_HOST_PASSWORD,但正如我测试的那样,我们还应该指定 SERVER_EMAIL,并且只有当 SERVER_EMAIL 等于 EMAIL_HOST_USER 时才能发送电子邮件,例如

    EMAIL_HOST = 'smtp.163.com'  
    SERVER_EMAIL = '234327894-cold@163.com'  # 
    EMAIL_HOST_USER = '234327894-cold@163.com'  # 
    EMAIL_HOST_PASSWORD = '234327894123'  #
    

    Django 使用AdminEmailHandler 为它收到的每条日志消息向站点管理员发送一封电子邮件。 除了 Django,我们还可以使用 Python 的 logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0) 做同样的事情。 例如,将以下代码放入views.py(更改您的帐户),它将通过电子邮件报告未处理的异常并导致内部服务器错误(HTTP 状态代码 500)。

    import logging
    logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d %I:%M:%S %p', handlers=[logging.handlers.SMTPHandler('smtp.163.com', '234327894-cold@163.com', ['234327894-cold@163.com'], 'LYYDownloader Server Exception', credentials=('234327894-cold@163.com', '234327894123'))])
    

    比较AdminEmailHandlerSMTPHandler,我主张尽可能使用SMTPHandler。 首先,AdminEmailHandler 是 Django 特有的,虽然您可以在任何 Python 程序中使用 SMTPHandler,但您应该注意的是,在客户端软件中使用 SMTPHandler 时,某些防病毒软件可能会将软件视为间谍软件,所以当您的软件即将发送电子邮件时,您应该通知用户。 其次,我发现AdminEmailHandler 发送的电子邮件有一堆信息,而SMTPHandler 只是发送了Python 异常信息,这使得调试有点清晰!

    第三,如果你在Django中配置了settings.py中的邮箱,即使你的邮箱确认有问题,也不会抛出异常,而SMTPHandler总是会抛出使用中出错的异常。

    引用http://redstoneleo.blogspot.com/2016/12/email-reporting-exceptions-and-errors_30.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 2019-02-08
      • 1970-01-01
      • 2021-10-28
      • 2015-05-04
      • 1970-01-01
      相关资源
      最近更新 更多