2012-01-06 31 views
5

Tôi đang sử dụng một bên thứ ba để gửi email và họ cho phép tôi phân loại email của mình bằng cách thêm tiêu đề vào email tôi gửi qua chúng.Có thể thêm tiêu đề vào email django gửi cho quản trị viên khi 500 được tạo không?

Có thể thêm tiêu đề vào email ngoại lệ trước khi email được gửi không? Hoặc ít nhất, tôi sẽ quản lý việc gửi email bằng cách bắt các ngoại lệ trong middleware, nhưng làm thế nào để tôi tạo ra các email django đáp ứng tốt đẹp gửi cho tôi trên một 500?

EDIT: Tôi biết cách thêm tiêu đề vào email, tôi biết cách xử lý ngoại lệ thông qua phần mềm trung gian. Tôi quan tâm đến cách tạo ra cùng một email mà django gửi ngoại lệ, để tôi có thể thêm một tiêu đề.

Trả lời

8
  1. Lớp con AdminEmailHandler (được định nghĩa trong django.utils.log).
  2. Định cấu hình logging cho phù hợp.

Sau đây là cách AdminEmailHandler công trình:

class AdminEmailHandler(logging.Handler): 
    """An exception log handler that emails log entries to site admins. 

    If the request is passed as the first argument to the log record, 
    request data will be provided in the email report. 
    """ 

    def __init__(self, include_html=False): 
     logging.Handler.__init__(self) 
     self.include_html = include_html 

    def emit(self, record): 
     try: 
      request = record.request 
      subject = '%s (%s IP): %s' % (
       record.levelname, 
       (request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), 
       record.msg 
      ) 
      filter = get_exception_reporter_filter(request) 
      request_repr = filter.get_request_repr(request) 
     except: 
      subject = '%s: %s' % (
       record.levelname, 
       record.getMessage() 
      ) 
      request = None 
      request_repr = "Request repr() unavailable." 

     if record.exc_info: 
      exc_info = record.exc_info 
      stack_trace = '\n'.join(traceback.format_exception(*record.exc_info)) 
     else: 
      exc_info = (None, record.getMessage(), None) 
      stack_trace = 'No stack trace available' 

     message = "%s\n\n%s" % (stack_trace, request_repr) 
     reporter = ExceptionReporter(request, is_email=True, *exc_info) 
     html_message = self.include_html and reporter.get_traceback_html() or None 
     mail.mail_admins(subject, message, fail_silently=True, html_message=html_message) 

Đối với chỉ tham khảo: Câu trả lời trước đây của tôi.

  1. Tạo một tùy chỉnh middleware: lấy cảm hứng từ CommonMiddleware trong https://code.djangoproject.com/browser/django/trunk/django/middleware/common.py (có một cái nhìn tại process_response)
  2. Tạo một hàm send_mail_with_exception_header dựa trên https://code.djangoproject.com/browser/django/trunk/django/core/mail/message.py

Dưới đây là một ví dụ:

# Custom middleware 

class MyErrorMiddleware(object): 
    def process_response(self, request, response): 
     if response.status_code == 404: 
      domain = request.get_host() 
      referer = request.META.get('HTTP_REFERER', None) 
      is_internal = _is_internal_request(domain, referer) 
      path = request.get_full_path() 
       if referer and not _is_ignorable_404(path) and (is_internal or '?' not in referer): 
        ua = request.META.get('HTTP_USER_AGENT', '<none>') 
        ip = request.META.get('REMOTE_ADDR', '<none>') 
        mail_error("Broken %slink on %s" % ((is_internal and 'INTERNAL ' or ''), domain), 
         "Referrer: %s\nRequested URL: %s\nUser agent: %s\nIP address: %s\n" \ 
            % (referer, request.get_full_path(), ua, ip), 
            fail_silently=True) 
       return response 

# Custom mail_error function 

def mail_error(subject, message, fail_silently=False, connection=None, 
        html_message=None): 
    """Sends a message to the managers, as defined by the MANAGERS setting.""" 
    if not settings.MANAGERS: 
     return 

    # put your extra headers here 
    mail = EmailMultiAlternatives(u'%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject), 
       message, settings.SERVER_EMAIL, [a[1] for a in settings.MANAGERS], 
       connection=connection, header={}) 
    mail 
    if html_message: 
     mail.attach_alternative(html_message, 'text/html') 
    mail.send(fail_silently=fail_silently) 
+0

Tôi hiểu điều này, nhưng làm thế nào để tôi tạo ra các dữ liệu đẹp mà thường được gửi trong một email ngoại lệ quản trị? – MattoTodd

+0

Xin lỗi. Tôi cập nhật câu trả lời của tôi với AdminEmailHandler, trong đó cho bạn thấy làm thế nào Django hiện nó. – charlax

+0

Tôi hiện đang chạy django 1.2, không có mô-đun django.utils.log, bạn có biết nơi này tồn tại trong phiên bản 1.2 không? – MattoTodd

Các vấn đề liên quan