django 可以轻松跟celery结合实现异步任务,只需简单配置即可

同步执行和异步执行

注意:即使Celery的任务没有执行完成,但是已经创建了任务ID。可以利用前台的定时任务发送Ajax异步请求根据ID查询结果

项目整合

项目的目录结构:

项目前提: 安装并启动Redis

CeleryTest/settings.py

INSTALLED_APPS = [
...
'app01', # 注册app
]
MIDDLEWARE = [
...
# 'django.middleware.csrf.CsrfViewMiddleware',
...
] STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),) # 现添加的配置,这里是元组,注意逗号
TEMPLATES = [
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
]
# for celery
CELERY_BROKER_URL = 'redis://192.168.2.105',
CELERY_BACKEND_URL = 'redis://192.168.2.105', # 用于Celery的返回结果的接收

CeleryTest/urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from app01 import views
urlpatterns = [
url(r'index/', views.Index),
url(r'task_res/', views.task_res),
]

app01/views.py

from django.shortcuts import render,HttpResponse
from app01 import tasks
# Create your views here.
# 视图触发Celery的用户请求 def Index(request):
print('进入Index...')
res1 = tasks.add(5, 999)
res = tasks.add.delay(5, 1000)
print("res:", res)
return HttpResponse(res) # 前台通过ID获取Celery的结果
from celery.result import AsyncResult
def task_res(request):
result = AsyncResult(id="5cf8ad07-8770-450e-9ccd-8244e8eeed19")
# return HttpResponse(result.get())
return HttpResponse(result.status) # 状态有Pending, Success, Failure等结果

app01/tasks.py   文件名必须为tasks.py

# 文件名必须为tasks.py,Djaogo才能发现Celery
from __future__ import absolute_import, unicode_literals
from celery import shared_task # Django starts so that the @shared_task decorator (mentioned later) will use it:  
@shared_task # Django的各个App里都可以导入这个任务,否则只能在app01这个Django的App内使用
def add(x, y):
return x + y @shared_task
def mul(x, y):
return x * y @shared_task
def xsum(numbers):
return sum(numbers)

CeleryTest/celery.py 文件名必须为celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery # set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CeleryTest.settings') app = Celery('CeleryTest') # Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY') # Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))

CeleryTest/__init__.py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app __all__ = ['celery_app']

Django前台运行结果[获取到了任务ID]:此时只有Django操作

Django后台运行结果:此时只有Django操作

上传文件到Linux服务器【Linux服务器需安装好Django服务】

需要Ubuntu下安装Django

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django

Linux下启动Celery的worker: 【此时Win7下的Django配合Linux下的Celery执行】

omc@omc-virtual-machine:~/Celery/CeleryTest$  celery -A CeleryTest worker -l info

前台浏览器触发Django的views请求到Linux的Celery的worker进行结果处理

梳理一下整个的流程:

Win7下的Django配置好了和Celery的整合,连接上Redis。当有请求从浏览器发送过来的时候,从URL映射到Django的views里面,在views里面调用了tasks.add.delay(5, 1000)此时将任务请求存储在了Redis里面。后台Linux下同样也放了一份根Win7下同样的工程[实际上只需要Celery的部分即可],进入Linux下的目录后启动Celery的worker,worker从Redis中取出任务去执行。而与此同时Django已经将任务的ID返回给了前台,前台可以根据任务ID返回的状态判断任务是否完成,完成后从Redis中获取任务的结果进行页面渲染即可,从而达到了异步的效果,就是前台不用直接等待结果的返回,而是根据结果的状态来获取最后的结果。

Linux下安装Django

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django

问题解决

【20180430】一个由于Django版本和Celery版本差异引起的错误,导致一下午很失落,最后误打误撞解决,很失望

报错信息:

KeyError: 'backend'

During handling of the above exception, another exception occurred:

settings.py    ---Celery的配置错误:

  # for celery
CELERY_BROKER_URL = 'redis://192.168.2.105',
CELERY_RESULT_BACKEND = 'redis://192.168.2.105', # 用于Celery的返回结果的接收

问题解决:

settings.py

# for celery
CELERY_BROKER_URL = 'redis://192.168.2.105',
CELERY_BACKEND_URL = 'redis://192.168.2.105', # 用于Celery的返回结果的接收

Celery学习--- Celery 最佳实践之与django结合实现异步任务的更多相关文章

  1. Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

    Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...

  2. Celery学习---Celery 与django结合实现计划任务功能

    项目的目录结构: 项目前提: 安装并启动Redis 安装Django和Celery的定时任务插件 安装方法一: pip直接安装[安装了pip的前提下] omc@omc-virtual-machine: ...

  3. Celery学习--- Celery操作之定时任务

    celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat 文件定时执行任务 项目前提: 安装并启动Redis celery_Sche ...

  4. Celery学习--- Celery在项目中的使用

    可以把celery配置成一个应用,注意连接文件命名必须为celery.py 目录格式如下 项目前提: 安装并启动Redis CeleryPro/celery.py   [命名必须为celery.py] ...

  5. Celery学习---Celery 分布式队列介绍及安装

    Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...

  6. 学习JavaScript最佳实践方法

    首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要说,“靠,你丫半桶水,凭啥教我们”.您先别急着骂,先听我说. 你叫一个大学生去教小学数 ...

  7. 学习shiro最佳实践,绝对正确

    按照https://blog.csdn.net/qq_34021712/column/info/26947学习,基本能解决shiro一切问题,谢谢该博主

  8. celery最佳实践

    作为一个Celery使用重度用户.看到Celery Best Practices这篇文章.不由得菊花一紧. 干脆翻译出来,同一时候也会添加我们项目中celery的实战经验. 至于Celery为何物,看 ...

  9. Celery最佳实践(转)

    原文:http://my.oschina.net/siddontang/blog/284107 英文原文:https://denibertovic.com/posts/celery-best-prac ...

随机推荐

  1. PHP初级篇

    PHP初级篇 PHP环境搭建: 企业中常用到的环境是:Linux+Apache+MySQL+PHP 学习环境是:Windows+Apache+MySQL+PHP 工具 Apache 2.4.4 MyS ...

  2. input属性type为file打开文件资源管理器时,如何限制多次选取或只能一次选取的行为

    1.input标签没有设置multiple属性,文件资源管理器默认一次选取 <!doctype html> <html lang="en"> <hea ...

  3. hadoop学习笔记(三):hadoop文件结构

    hadoop完整安装目录结构: 比较重要的包有以下4个: src hadoop源码包.最核心的代码所在目录为core.hdfs和mapred,他们分别实现了hadoop最重要的3个模块:基础公共库.H ...

  4. OpenStack Identity(Keystone)概述及示例

    OpenStack 的验证服务有两个主要功能: 1. 用户管理(租户.用户.权限) 2. Service catalog,管理服务的目录和它们的endpoint. 相关概念 1. User User即 ...

  5. SQL Server附加数据库拒绝访问解决方法汇总

    @本文来自百度 方法一:修改权限法 1 打开要附加的数据库文件所在的文件夹,即扩展名为mdf的文件所在的文件夹,如下图所示: 2 右键单击mdf文件,选择“属性”,如下图所示: 3 单击“安全”选项卡 ...

  6. linq之多表连接

    1.左连接: var LeftJoin = from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals ...

  7. (在数据库中调用webservices。)SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问

    --开启 Ole Automation Procedures sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_config ...

  8. git分支branch合并到主分支master

    如何使用git将分支branch合并到主干master上 对于一人独立使用git进行系统开发时,branch分支相当于版本(Version),如果每次都将新的分支branch提交到GitHub上,则会 ...

  9. C#基础笔记(第十四天)

    1.MD5加密 用户在数据库存密码需要进行再加密,这样一个过程叫MD5加密只要涉及到存用户的密码一定要用MD5加密MD5密码一般都是16进制的把一个密码转换成16进制的过程就叫MD5加密把字符串加密成 ...

  10. Oracle安装后遇到错误:The Network Adapter could not establish the connection

    http://note.youdao.com/noteshare?id=e6baee7ea7b7f60d7a265124e2bdd46c&sub=988945C6DDE843D5A7D6588 ...