django防止接口大量请求(一行代码实现Django异步发送邮件功能)

学习django框架的时候,需要用到自动发邮件功能,逻辑大概是这样的:客户在A页面下单并填写邮箱(非必须,也可能不填),如果没填写邮箱直接会重定向到B页面,如果有填写邮箱会先给客户发邮件然后重定向到B页面,最后B页列出简要的订单信息,下面我们就来聊聊关于django防止接口大量请求?接下来我们就一起去了解一下吧!

django防止接口大量请求(一行代码实现Django异步发送邮件功能)

django防止接口大量请求

学习django框架的时候,需要用到自动发邮件功能,逻辑大概是这样的:客户在A页面下单并填写邮箱(非必须,也可能不填),如果没填写邮箱直接会重定向到B页面,如果有填写邮箱会先给客户发邮件然后重定向到B页面,最后B页列出简要的订单信息。

问题:

当客户有填写邮件,用Django自带的send_mail发送邮件时,发现从A页面跳转到B页面会卡在发邮件这个步骤3-4秒,实际上,用ThinkPHP6框架时同样如此,也就是说卡顿跟语言或框架无关,完成发送邮件的整个过程确实需要一定的时间。如果卡在A页面会导致客户以为下单没有成功然后重复下单,所以不能让发邮件功能阻塞A页面向B页面跳转。

解决方案

既然发送邮件无论如何都要几秒钟,那只有让发送邮件和重定向到B页面异步执行。搜索了一下python异步方案,发现很多方案都用了celery这个框架,但是配置太复杂,而我的需求又很简单,懒得写那么多,最后在stackoverflow看到别人用python自带的threading模块,实现代码非常简单:

from django.core.mail import send_mail import threading def thanks(request): orderid = request.GET.get('orderid') # 接收订单id language = request.GET.get('language') # 接收客户下单页面语言 orderinfo = models.SingaporeOrder.objects.filter(orderid=orderid) # 查询订单 for i in orderinfo: # 遍历订单 if i.email and ('@' in i.email): # 判断客户邮箱是否存在且格式是否正确 threading.Thread(target=send_mail,args=('nihao', 'nihao', 'XXXXXX@163.com', [ i.email ])).start() # 创建线程,发送邮件

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页