今天小编利用Django 3.0 +Redis 3.4 +Celery 4.4开发了个小应用。应用不复杂,但知识点很多,非常适合新手练手。项目需求如下:
创建两个页面,一个用于创建页面,一个用于动态展示页面详情,并提供静态HMTL文件链接
一个页面创建完成后,使用Celery异步执行生成静态HTML文件的任务
使用redis作为Celery的Broker
使用flower监控Celery异步任务执行情况
项目完成后演示见下面动画。本项目的GitHub源码地址在最后,请耐心阅读。
第零步:pip设置国内源
国内用户使用pip安装python包特别慢,这主要是应为国内连接国外网络不稳定。为加速python包的安装,首先将pip安装源设置为国内的镜像,比如阿里云提供的镜像。
linux系统修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:
[global]index-url = https://mirrors.aliyun.com/pypi/simple/
windows系统直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下:
[global]index-url = http://mirrors.aliyun.com/pypi/simple/
第一步:安装Django并创建项目myproject
使用pip命令安装Django.
pip install django==3.0.4 # 安装Django,所用版本为3.0.4
使用django-admin startproject myproject创立一个名为myproject的项目
django-admin startproject myproject
整个项目完整目录机构如下所示, 项目名为myproject, staticpage为app名。
第二步:安装redis和项目依赖的第三方包
项目中我们需要使用redis做Celery的中间人(Broker), 所以需要先安装redis数据库。redis网上教程很多,这里就简要带过了。
Windows下载地址:https://github.com/MSOpenTech/redis/releases
Linux下安装(Ubuntu系统):$ sudo apt-get install redis-server
本项目还需要安装如下依赖包,你可以使用pip命令逐一安装。
pip install redis==3.4.1
pip install celery==4.4.2
pip install eventlet # celery 4.0+版本以后不支持在windows运行,还需额外安装eventlet库
你还可以myproject目录下新建requirements.txt
加入所依赖的python包及版本,然后使用pip install -r requirements.txt
命令安装所有依赖。本教程所使用的django, redis和celery均为最新版本。
django==3.0.5
redis==3.4.1
celery==4.4.2
eventlet # for windows only
第三步:Celery基本配置
修改
settings.py
新增celery有关的配置。celery默认也是有自己的配置文件的,名为celeryconfig.py
, 但由于管理多个配置文件很麻烦,我们把celery的配置参数也写在django的配置文件里。
# 配置celery时区,默认时UTC。
if USE_TZ:
timezone = TIME_ZONE
# celery配置redis作为broker。redis有16个数据库,编号0~15,这里使用第1个。
broker_url = 'redis://127.0.0.1:6379/0'
# 设置存储结果的后台
result_backend = 'redis://127.0.0.1:6379/0'
# 可接受的内容格式
accept_content = ["json"]
# 任务序列化数据格式
task_serializer = "json"
# 结果序列化数据格式
result_serializer = "json"
# 可选参数:给某个任务限流
# task_annotations = {'tasks.my_task': {'rate_limit': '10/s'}}
# 可选参数:给任务设置超时时间。超时立即中止worker
# task_time_limit = 10 * 60
# 可选参数:给任务设置软超时时间,超时抛出Exception
# task_soft_time_limit = 10 * 60
# 可选参数:如果使用django_celery_beat进行定时任务
# beat_scheduler = "django_celery_beat.schedulers:DatabaseScheduler"
# 更多选项见
# https://docs.celeryproject.org/en/stable/userguide/configuration.html
在
settings.py
同级目录下新建celery.py
,添加如下内容:
# coding:utf-8
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# 指定Django默认配置文件模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
# 为我们的项目myproject创建一个Celery实例。这里不指定broker容易出现错误。
app = Celery('myproject', broker='redis://127.0.0.1:6379/0')
# 这里指定从django的settings.py里读取celery配置
app.config_from_object('django.conf:settings')
# 自动从所有已注册的django app中加载任务
app.autodiscover_tasks()
# 用于测试的异步任务
@app.task(bind=True)
d