在 Django 中向用户返回响应后发送电子邮件

Send email after returning response to user in django

我想向新用户发送验证邮件。但是由于连接速度慢,发送电子邮件需要很长时间,用户会看到 CONNECTION TIMED OUT 错误。我想 return 回复用户,然后发送电子邮件。我已经尝试 StreamingHttpResponse 并使用 yield。但它 return 得到了令人毛骨悚然的反应,而不是我想要的反应。
我更喜欢使用 function view 来完成它,但如果我必须使用 class view 也没有问题。我该怎么办?

from django.shortcuts import render
from django.http import HttpRequest

def sign_up (request: HttpResponse):
    method = request.method
    if method == 'GET':
        # checking cookies
        return render(request, "template name", context)
    if method == 'POST':
        # validating data
        if unvalid_data:
            return render(request, "template name", context)
        # saving data
        return render(request, "template name", context)
        # sending email

感谢 NeuronQ in this question 我得到了这个想法并且它正在运行:

# myclass.py
from django.http import HttpResponse

__all__ = ['do_after_render']

class do_after_response (HttpResponse):
    def __init__(self, do_after, content=b'', do_after_args=[], *args, **kwargs):
        self.do_after = do_after
        self.do_after_args = do_after_args
        super().__init__(content=content, *args, **kwargs)
    def close(self):
        super().close()
        self.do_after(*self.do_after_args)

def do_after_render (do_after, request, template_name, context=None, do_after_args=[], content_type=None, status=None, using=None):
    content = render_to_string(template_name, context, request, using=using)
    return do_after_response(do_after=do_after, content=content, do_after_args=do_after_args, content_type=content_type, status=status)
# views.py
from .myclass import *

from django.shortcuts import render
from django.http import HttpRequest

def send_mail (some_args, some_other_args):
    # sending email

def sign_up (request: HttpResponse):
    method = request.method
    if method == 'GET':
        # checking cookies
        return render(request, "template name", context)
    if method == 'POST':
        # validating data
        if unvalid_data:
            return render(request, "template name", context)
        # saving data
        do_after_args = [some_args, some_other_args]
        return do_after_render(send_mail, request, "template name", context, do_after_args)