Django中使用Celery(通用方案、官方方案)

Django中使用Celery(通用方案、官方方案)

目录

通用方案

场景

现在定义了一张图片表,要求每隔一段时间就将表内容更新进缓存库中

前置准备

  • 安装模块
bash 复制代码
pip install Django4.2.13
pip install celery
pip install cache
pip install eventlet
pip install redis
  • 定义图片表
python 复制代码
from django.db import models

class Display(models.Model):
    title = models.CharField(max_length=16, unique=True, verbose_name='名称')
    image = models.ImageField(upload_to='banner', verbose_name='图片')
    link = models.CharField(max_length=64, verbose_name='跳转链接')
    info = models.TextField(verbose_name='详情')
  • 路径结构

完整代码

python 复制代码
# tasks.py
from celerys import app
from datetime import timedelta

app.conf.beat_schedule = {
    'update_cache_every_30_seconds': {
    'task': 'celerys.update_cache',
    'schedule': timedelta(seconds=30),
    },
}
python 复制代码
# celerys.py
import os
import sys

# 执行文件必须与Django配置的环境变量同级(manage.py)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Luffy_API.settings.dev')
import django
django.setup()

from app.models import Display
from app.serializer import DisplaySerializer
from celery import Celery
from celery.schedules import crontab
from datetime import timedelta
from django.core.cache import cache

broker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery('celery',broker=broker,backend=backend)

@app.task
def update_cache():
    queryset = Display.objects.all()
    serializer = DisplaySerializer(instance=queryset, many=True)
    cache_data = queryset.values()
    cache.set('display', cache_data)
    return '缓存已更新'
  • 执行命令
bash 复制代码
celery -A celerys worker -l info -P eventlet
celery -A tasks beat -l info

Celery官方方案

【1】注册celery配置

settings中添加Celery的配置文件

python 复制代码
# 用redis创建队列库1
CELERY_BROKER_URL='redis://127.0.0.1:6379/1'
# 用redis创建结果存储库2
CELERY_RESULT_BACKEND='redis://127.0.0.1:6379/2'
CELERY_ACCEPT_CONTENT=['json']
CELERY_TASK_SERIALIZER='json'
# 结果序列化方案
CELERY_RESULT_SERIALIZER='json'
# 任务结果过期时间,秒
CELERY_TASK_RESULT_EXPIRES=60 * 60 * 24
# 时区配置
CELERY_TIMEZONE='Asia/Shanghai'

【2】创建celery文件

新建tasks文件和celerys文件

  • 目录结构

【3】init注册

在根目录下的__init__.py文件中注册celerys文件,如果不加则会自动识别根目录中的celery文件而不是我们创建的celerys

python 复制代码
from .celerys import app as celery_app

__all__=('celery_app',)

【4】添加任务

tasks.py文件中存储要被执行的异步文件

python 复制代码
from celerys import app

@add.task()
def add(a, b):
    return a + b

celerys.py存放celery的配置文件

python 复制代码
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django_API.settings.dev')
import django
from celery import Celery, shared_task
from django.conf import settings

# 启动worker的命名
app = Celery('Django_API')

# 自动检索前缀为CELERY的配置
app.config_from_object('django.conf:settings', namespace='CELERY')

# 自动搜索每个app中的tasks.py文件
app.autodiscover_tasks()

【5】启动worker异步任务

启动worker

bash 复制代码
celery -A Django_API worker -l info -P eventlet

【6】在view中调用

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from .tasks import add

class TestView(APIView):
    def get(self, request):
        res = add.delay(500, 2)
        return Response(f'res:{res}')
相关推荐
蓝婷儿1 小时前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习
chao_7892 小时前
链表题解——两两交换链表中的节点【LeetCode】
数据结构·python·leetcode·链表
大霞上仙2 小时前
nonlocal 与global关键字
开发语言·python
Mark_Aussie3 小时前
Flask-SQLAlchemy使用小结
python·flask
程序员阿龙3 小时前
【精选】计算机毕业设计Python Flask海口天气数据分析可视化系统 气象数据采集处理 天气趋势图表展示 数据可视化平台源码+论文+PPT+讲解
python·flask·课程设计·数据可视化系统·天气数据分析·海口气象数据·pandas 数据处理
ZHOU_WUYI3 小时前
Flask与Celery 项目应用(shared_task使用)
后端·python·flask
且慢.5893 小时前
Python_day47
python·深度学习·计算机视觉
佩奇的技术笔记3 小时前
Python入门手册:异常处理
python
大写-凌祁4 小时前
论文阅读:HySCDG生成式数据处理流程
论文阅读·人工智能·笔记·python·机器学习
爱喝喜茶爱吃烤冷面的小黑黑4 小时前
小黑一层层削苹果皮式大模型应用探索:langchain中智能体思考和执行工具的demo
python·langchain·代理模式