django框架如何集成celery进行开发
作者:茁壮的小草 发布时间:2022-09-13 11:18:24
上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发。
本系列文章的开发环境:
window 7 + python2.7 + pycharm5 + celery3.1.25 + django1.9.4
一、项目功能
在web应用中,用户触发一个操作,执行后台处理程序,这个程序需要执行很长时间才能返回结果。怎样才能不阻塞http请求,不让用户等待从而提高用户体验呢?这是本例需要解决的问题。具体设计是:用两个网页进行展示,一个网页是提交加法计算任务到后台进行计算;另外一个网页查看所有计算任务的详细情况,如任务ID,任务状态等。
就如下图所示:输入:http://127.0.0.1:8000/index/
点击查看任务链接,查看所有任务的执行情况:sucess表示执行成功,started表示已经开始执行了。
二、项目结构
Broker我这里选择RabbitMQ,结果存储Backend我选择django-celery。
三、开始编程
1、安装django-celery:
$ pip install django-celery
2、新建django工程项目test_celery,如下:
【说明】:tools是django包,和test_celery是同级目录,该包功能主要存放工具类函数和执行的任务;
celery.py:celery配置文件信息
3、编辑setting.py,添加配置celery broker和backend
#celery setting
import djcelery
djcelery.setup_loader() #加载djcelery
BROKER_URL = 'pyamqp://guest@localhost//' #配置broker
BROKER_POOL_LIMIT = 0
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend' #配置backend
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'djcelery', #django-celery必须添加
'test_celery',
]
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'celery', 'USER':'username', 'PASSWORD':'password', 'HOST':'ip', 'PORT':3306, }}
4、新建celery.py文件,添加如下内容:
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_celery.settings')
from django.conf import settings # noqa
app = Celery('test_celery')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
5、新建tasks.py文件,创建任务
from __future__ import absolute_import
from celery import shared_task
import time
@shared_task(track_started=True)
def add(x, y):
time.sleep(30) #模拟长时间执行
return x + y
6、创建model.py,新建存储任务信息的表:
from django.db import models
#在数据库中生成test_celery_add表
class Add(models.Model):
task_id = models.CharField(max_length=128) #存储taskid
first = models.IntegerField() #存储第一个加数
second = models.IntegerField() #存储第二个加数
log_date = models.DateTimeField() #存储开始时间
7、进入test_celery目录下,有manage.py那一层,执行:
python manage.py makemigrations test_celery
python manage.py migrate
到这里会在数据库中生成以下表:
8、接下来编写前端html文件以及view文件,具体请自己编写或者下载源码运行。
9、编码完成后,启动worker,然后就可以在网页上进行模拟操作了
进入test_celery项目目录下,也就是有manage.py文件那一层,执行以下命令启动worker:
celery worker -A test_celery -l info
10、在浏览器中,http://127.0.0.1:8000/index/,录入第一个加数和第二个加数,点击计算,就交给后台tasks执行了,这时可以点击查看任务进行查看。
项目源代码下载
来源:http://www.cnblogs.com/mysql-dba/p/6895190.html
猜你喜欢
- 问题:每次打开pycharm打开py文件光标都是insert模式, 像下面图片那样解决方案:讲Tools里面的Vim Emulator勾选去
- 经常在网站上看到诸如www.abc.com/?news或者www.abc.com/?id=123这样的网址,一开始觉得很神秘,其实现在看多了
- 1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES W
- 根据国务院文件,5.19-5.21为全国哀悼日,在此期间,全国和各驻外机构下半旗志哀,停止公共娱乐活动,外交部和我国驻外使领馆设立吊唁簿。5
- 这个绝对是IE6的bug。我想要达到的是如下的效果。通过三个div,排布好侧栏和内容区。我用了如下的css:<style type=&
- 前言在laravel项目开发中,经常使用到公共函数,那如何在laravel配置全局公共函数呢??下面话不多说了,来一起看看详细的介绍吧方法如
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 准备篇1.配置防火墙,开启80端口、3306端口1 vim /etc/sysconfig/iptables2 -A INPUT -m sta
- oracle10g数据备份 1.用sql/plus developer,选中要备份的数据表,右击选择"Export data&qu
- 介绍godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息,并在go命令前加壳来做到依赖管理godep 建议在 g
- hmac主要应用在身份验证中,它的使用方法是这样的:1. 客户端发出登录请求(假设是浏览器的GET请求)2. 服务器返回一个随机值,并在会话
- 问题描述:已有的model,修改之后,想重新建模,于是将migrations文件夹中除__init__.py之外其他文件都删掉,再次执行以下
- 刚才运行了一段代码,来查看Request.ServerVariables里面有多少值,看了一下,共50个!代码<%=Request.S
- shapefile转换geojsonimport shapefileimport codecsfrom json import dumps#
- 很久没有更新blog了,这段时间实在是发生了很多的事,累身累心。但还是有很多想做的事,比如更新merceCSS、把一直以来所总结的有关模块化
- 本文实例讲述了PHP简单检测网址是否能够正常打开的方法。分享给大家供大家参考,具体如下:这是一个检测网址是否能正常打开的PHP代码,通过下面
- 就是在mysql命令行登录的时候加上: --pager=more 参数可以使用linux下的more来分页,很好用
- 自从2005年8月11日阿里巴巴宣布收购雅虎中国的全部资产后,做为阿里巴巴集团的创始人马云心里盘算的事应该是如何把雅虎中虎整合进阿里巴巴这个
- 如下所示:#! usr/bin/python#coding=utf-8 import numpy as npimport matplotli
- Inserted 表中的行是触发器表中新行的副本。 语法 返回所有列 INSERT INTO [tableName] ([columnNam