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}')
相关推荐
IVEN_3 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang5 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮5 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling5 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮8 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
曲幽8 小时前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
孟健1 天前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞1 天前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽1 天前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers