当用户发起 request 请求后,并等待及返回 response 对象。在某些 view 视图函数中,可能需要执行一段耗时操作的程序,那么此时用户就会等待很长时间,由此造成极差的用户体验,例如下载或上传文件、发送邮件、 发送验证码等。此时,就可以考虑使用 celery 异步任务处理,并将耗时操作的程序放到 celery 中来执行
celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。异步任务比如是发送邮件、文件上传、 图像处理等等一些比较耗时的操作,定时任务是需要在特定时间执行的任务
def sayhi(request):
print("----hello----")
time.sleep(5)
print("---world---")
return HttpResponse("This is say hi")
项目的 settings.py 文件中
urlpatterns = [
url(r'^sayhi/',sayhi),
]
启动服务: python manage.py runserver
>>> http://127.0.0.1:8000/sayhi/
控制台:
项目下新建 包celery_task,包下面新建tasks.py文件
import os
import django
# sessionCookieLogin 是我的项目名
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sessionCookieLogin.settings")
django.setup()
# redis://127.0.0.1:6379/2 是我确定数据库为空就选择了第2个
app= Celery('celery_task.tasks',broker='redis://127.0.0.1:6379/2')
@app.task
def sayHi():
print("-----------good good study day day up------------")
time.sleep(5)
print("-----------keep going------------")
因为第2个数据库被我选择了所以不为空,想选择哪个数据库可以从第一个开始查看
select 1
keys *
出现(empty list or set) 即可选择这个数据库
先不急着运行, 先安装另外一个库 pip install eventlet
随后在tasks.py文件中输入
celery -A celery_task.tasks worker -l info -P eventlet
重新启动服务器: python manage.py runserver
进入 http://127.0.0.1:8000/sayhi/
跳回 tasks.py 文件继续配置
from django.conf import settings
from django.core.mail import send_mail
@app.task
def send_Email(email):
send_mail(subject="极致果蔬用户激活邮件",
message="",
from_email=settings.EMAIL_FROM,
# 把目标邮箱输入
recipient_list=[email],
html_message='<h1>极致果蔬,欢迎您</h1>')
为了防止报错提前在tasks.py 文件配置:
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sessionCookieLogin.settings")
django.setup()
在视图函数views.py里面调用异步
def send_email(request):
"""发送消息内容到邮箱"""
# message = '<a href="http://www.edu118.cn/course/explore/wulianwang" target="_blank">点击激活</a>'
# # 发送邮件
# send_mail(subject = "注册激活",
# message = "hello",
# from_email = settings.EMAIL_FROM,
# recipient_list = ["1173690628@qq.com"],
# html_message=message)
# 目标邮箱
send_Email.delay('XXX@qq.com')
return HttpResponse("OK")
启动服务器 python manage.py runserver
# celery_task 是我的tasks.py文件的目录名
再接着另起一个窗口执行 celery -A celery_task.tasks worker -l info -P eventlet