celery在Django中的应用
这里不解释celery,如果不清楚可以参考下面链接:
http://docs.celeryproject.org/en/latest/getting-started/introduction.html
这里来演示一下在Django项目中如何使用celery:
1. 首先我们需要使用到两个库,用pip安装:
pip install celery pip install django-celery
2. 在celery建议使用rabbitmq作为消息代理,当然也支持redis作代理,abbitmq提供的队列和消息持久化机制确实更加稳定,所以对于追求稳定性的任务更适合适配rabbitmq作为中间件, 这里用rabbitmq作为消息代理,用redis作为存储后端
我的环境是deepin,安装rabbitmq和redis
sudo apt-get install rabbitmq-server
sudo apt-gei install redis
3. 在django中使用celery的方式和普通py文件中的方式略有不同,下面是一个向通过秒滴平台发送短信验证码的demo:
- 普通py文件用法:
# tasks.py import os
from celery import Celery app = Celery('tasks', backend='amqp://guest@localhost//', broker='redis://localhost:6379/1')
@app.task(name="send_verification_code")
def _send_verification_code(phone_number, verification_code):
"""
:param phone_number: 目标手机号
:param verification_code: 验证码
:return:
True:发送成功
False:发送失败
"""
api = getConfig('MiaoDi', 'api')
accountSid = getConfig('MiaoDi', 'accountSid')
templateid = getConfig('MiaoDi', 'templateid')
timeout_s = getConfig('MiaoDi', 'timeout')
param = '{},{}'.format(verification_code, timeout_s)
timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
sign = hash_sign(timestamp)
data = {
'accountSid': accountSid, 'templateid': templateid, 'param': param,
'to': phone_number, 'timestamp': timestamp, 'sig': sign
}
response = requests.post(url=api, data=data)
ret_json = response.text
ret_dict = eval(ret_json) if ret_dict.get('respCode') != '':
return False
else:
return True
# test.py
from tasks import _send_verification_code def send_verification_code(phone_number, verification_code):
task = _send_verification_code.delay(phone_number, verification_code)
if __name__ == '__main__':
phone_number = input('请输入手机号:')
verification_code = input('请输入验证码:')
send_verification_code(phone_number, verification_code)
启动celery 服务:
celery -A tasks worker --loglevel=info # 若在windows下报错,需再加 -P eventlet 表示绿色线程,把celery的并行执行方式改为 eventlet, 而不是默认的prefork,需要安装 :pip install eventlet
- django中用法推荐(只是推荐这样用,显得简洁方便管理,你当然可以将以上方法用在Django中):
在项目的setting.py中配置:
import djcelery djcelery.setup_loader() INSTALLED_APPS = (
······,
'djcelery',
·······
) # CELERY STUFF
BROKER_URL = 'amqp://guest@localhost//' # 使用的消息队列rabbitmq
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1' # 结果使用的存储介质为redis
CELERY_TASK_SERIALIZER = 'json' # 消息任务的序列化方式
CELERY_RESULT_SERIALIZER = 'json' # 结果的序列化方式
CELERY_TASK_RESULT_EXPIRES = 60 * 60 # celery任务执行结果的超时时
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TIMEZONE = 'Asia/Shanghai' # 建议不同的task使用不同的Queue,而不是都是用默认的Queue
CELERY_QUEUES = (
Queue(
"default",
Exchange("default"),
routing_key="default"),
Queue(
"request_to_chit_platform",
Exchange("request_to_chit_platform"),
routing_key="request_to_chit_platform"),
)
# Queue的路由
CELERY_ROUTES = {
'request_to_chit_platform': {"queue": "request_to_chit_platform",
"routing_key": "request_to_chit_platform"},
}
接下来就是celery tasks的编写:
项目APP与models.py同级下创建tasks.py

tasks.py
# coding=utf-8
import requests
import datetime
from celery import task
from utils.hash import hash_sign
from utils.common import getConfig @task(name="request_to_chit_platform")
def request_to_chit_platform(phone_number, verification_code):
""" :param phone_number: 目标手机号
:param verification_code: 验证码
:return:
True:发送成功
False:发送失败
""" proxy_dict = {
"http": "http://xxxxxxxxxxxxx:xxx/",
"https": "http://xxxxxxxxxxxxxxx:xxx/"
} api = getConfig('MiaoDi', 'api')
accountSid = getConfig('MiaoDi', 'accountSid')
templateid = getConfig('MiaoDi', 'templateid')
timeout_s = getConfig('MiaoDi', 'timeout')
param = '{},{}'.format(verification_code, timeout_s)
timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
sign = hash_sign(timestamp)
data = {
'accountSid': accountSid, 'templateid': templateid, 'param': param,
'to': phone_number, 'timestamp': timestamp, 'sig': sign
}
response = requests.post(url=api, data=data, proxies=proxy_dict)
# response = requests.post(url=api, data=data)
ret_json = response.text
ret_dict = eval(ret_json) if ret_dict.get('respCode') != '':
return False
else:
return True
接下来尝试去启动celery吧,在项目路径下执行:
python3 manage.py celery worker -c 10 --loglevel=info -Q request_to_chit_platform # 这样djcelery会帮助我们创建 request_to_chit_platform tasks的worker,并添加到 request_to_chit_platform 的队列 -c 指定worker数
然后创建tasks吧

然后看celery这边,发现已经成功执行执行了tasks,我这里为方便用了redis队列,效果是一样的

最后附上celery4.3.0的文档
http://docs.celeryproject.org/en/latest/index.html
celery在Django中的应用的更多相关文章
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- celery在Django中的集成使用
继上回安装和使用Redis之后,看看如何在Django中使用Celery.Celery是Python开发分布式任务列队的处理库.可以异步分布式地异步处理任务,也可定时执行任务等等.通常我们可以在Dja ...
- Celery在Django中的使用介绍
Celery在Django中的使用介绍 Celery简介 celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必须工具. 它是一个专注于实时处理的任务队列,同时也 ...
- Django 中使用 Celery
起步 在 <分布式任务队列Celery使用说明> 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能.本文介绍如何在 Django 中使用 Celery. 安装 ...
- Django中Celery的实现介绍(一)
Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...
- Django中使用Celery
一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...
- 分布式队列celery 异步----Django框架中的使用
仅仅是个人学习的过程,发现有问题欢迎留言 一.celery 介绍 celery是一种功能完备的即插即用的任务对列 celery适用异步处理问题,比如上传邮件.上传文件.图像处理等比较耗时的事情 异步执 ...
- Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示
解决办法: 在项目 proj/proj/celery.py文件中,看到下面这行配置: celery_app.config_from_object('django.conf:settings', nam ...
- Django中Celery http请求异步处理(四)
Django中Celery http请求异步处理 本章延续celery之前的系列 1.settings配置 2.编写task jib_update_task任务为更新salt jid数据 3.url设 ...
随机推荐
- (最大上升子序列) Super Jumping! Jumping! Jumping! -- hdu -- 1087
http://acm.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limit:1000MS ...
- Java火焰图在Netflix的实践
转自 http://www.infoq.com/cn/news/2015/08/java-flamegraph 亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要 ...
- wc.java
GitHub代码链接 1.项目相关要求 •基本功能列表: -c 统计文件中字符的个数 -w 统计文件中的词数 -l 统计文件中的行数 •拓展功能: -a 统计文件中代码行数.注释行数.空行 2 ...
- 基于注解方式@AspectJ的AOP
启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置: <aop:aspectj-autoproxy/> 这样Spring就能发现@ ...
- 读《深入理解Windows Phone 8.1 UI控件编程》1.4.3 框架的应用示例:自定义弹出窗口有感
前些天买了园子里林政老师的两本 WP8.1 的书籍.毕竟想要学得深入的话,还是得弄本书跟着前辈走的. 今天读到 1.4.3 节——框架的应用示例:自定义弹出窗口这一小节.总的来说,就是弄一个像 Mes ...
- 设计模式之命令模式(Command Pattern)
一.什么是命令模式? 命令模式,封装了方法调用细节,以解耦请求者与执行者,具体流程如下: 1.从请求者(客户)的角度看 请求者(客户)发出请求 -> 调用者(系统)构造命令对象封装请求 -> ...
- Android开发基于百度地图的乘车助手
写在前面: 出去玩免不了挤公交.等地铁,不知道乘车方案当然不行,用官方APP吧,缺点一大堆,手机浏览器在线查的话既慢又麻烦...为了解决这些问题,我们来做一个简版的出行助手,嘛嘛再也不用担心我会迷路了 ...
- HttpWebRequest 模拟浏览器访问网站
最近抓网页时报错: 要么返回 The remote server returned an error: (442)要么返回: 非法访问,您的行为已被WAF系统记录! 想了想,就当是人家加了抓网页的东西 ...
- JQuery - 动态添加Html后,如何使CSS生效,JS代码可用?
今天在开发JQuery Mobile程序时候,需要从服务器取得数据,随后显示在页面上的Listview控件中,数据完整获取到了,也动态添加到Listview控件中,但是数据对应的CSS没有任何效果了, ...
- Python3.5 学习八
#动态导入 官方建议import importlibimport_str="lib.aa"lib=importlib.import_module(import_str)obj=li ...