Django保存对象后如何发送邮件,但发送邮件功能不要延迟返回HttpResponse

时间:2016-08-08 12:50:32

标签: python django email

我想在将数据保存到数据库后发送电子邮件,但我不想等待完成发送电子邮件后返回HTTP响应,我想直接返回HTTP响应,然后发送Django自己的电子邮件。

def received(request):
    login=get_login(request)
    received=True
    cluster_list=models.Cluster.objects.all()
    Asset_Type=models.CategoryOfAsset.objects.all()
    if request.method=="GET":
        return render(request,"received.html",locals())
    if request.is_ajax():
        try:
            req=json.loads(request.body)
            meta_data_dict=req['meta_data']
            item_data_dict=req['all_item_data']['item_data']
            received_or_shipment=True
            insert_meta_item_to_DB(meta_data_dict,item_data_dict,received_or_shipment)
            sendTemplateEmail(meta_data_dict,item_data_dict)
            return HttpResponse(json.dumps('sucessful'))
        except Exception, e:
            logger.error(e)

现在代码会导致此错误:

  

ValueError:视图tool.views.received没有返回   HttpResponse对象

它返回了None。

2 个答案:

答案 0 :(得分:2)

使用本地SMTP服务器。

将导致邮件排队(即使它未被发送)几乎立即排队,因此您可以发送您的http响应,而不会被发送电子邮件的延迟所阻碍。

使用任务队列

使用最简单的形式,您可以将电子邮件消息放入表中,让cron作业定期检查该表并发送需要发送的任何消息。

稍微复杂一点的方法是使用Redis并让django CLI收听。

更复杂的(?)解决方案是使用Celery Task。

答案 1 :(得分:1)

最简单的解决方案是以异步方式运行:

import threading

def run_async(func, args):
    threading.Thread(target=func, args=args).start()

然后:

run_async([function], ([args]))