在django中将响应返回给用户后发送电子邮件

问题描述

我想向新用户发送验证电子邮件。但是由于连接速度慢,因此发送电子邮件需要很长时间,并且用户会看到CONNECTION TIMED OUT错误。我想将响应返回给用户,然后发送电子邮件。我已经尝试过StreamingHttpResponse并使用yield。但是它返回的是令人毛骨悚然的响应,而不是我想要的响应。
我更喜欢使用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,context)
        # saving data
        return render(request,context)
        # sending email

解决方法

感谢NeuronQ中的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,**kwargs)
    def close(self):
        super().close()
        self.do_after(*self.do_after_args)

def do_after_render (do_after,request,template_name,context=None,content_type=None,status=None,using=None):
    content = render_to_string(template_name,context,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,context)
        # saving data
        do_after_args = [some_args,some_other_args]
        return do_after_render(send_mail,do_after_args)