问题描述
我想向新用户发送验证电子邮件。但是由于连接速度慢,因此发送电子邮件需要很长时间,并且用户会看到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)