【问题标题】:Django how to send the email after save the object,but send email function don't delay return HttpResponseDjango如何在保存对象后发送电子邮件,但发送电子邮件功能不会延迟返回HttpResponse
【发布时间】:2016-12-14 06:11:43
【问题描述】:

我想在将数据保存到数据库后发送一封电子邮件,但我不想等待完成后发送电子邮件返回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。

【问题讨论】:

    标签: python django email


    【解决方案1】:

    使用本地 SMTP 服务器。

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

    使用任务队列

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      然后:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 2020-03-26
        • 2012-02-04
        • 1970-01-01
        • 2013-03-31
        相关资源
        最近更新 更多