使用celery,对缓存进行定时更新操作
home_task.py
from .celery import app
from home.models import Banner
from django.conf import settings
from home.serialzier import BannerSerializer
from django.core.cache import cache
@app.task
def update_banner():
# 查询数据库,拿到所有轮播图,序列化后,放到缓存中
banner_list = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')[:settings.BANNER_COUNT]
ser = BannerSerializer(instance=banner_list, many=True)
# 如果在视图类中,做序列化 ,因为视图类中有request对象,所以像图片这种,会自动加前面地址,
# 在这里没有request对象,需要手动拼
for item in ser.data:
item['image'] = settings.BACKEND_URL + item['image']
cache.set('home_banner_list', ser.data)
return True
celery.py
from celery import Celery
# 一、加载django配置环境
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffy_api.settings.dev")
broker = 'redis://127.0.0.1:6379/1' # 消息中间件 redis
backend = 'redis://127.0.0.1:6379/2' # 结果存储 redis
app = Celery(__name__, broker=broker, backend=backend,
include=['celery_task.course_task', 'celery_task.home_task', 'celery_task.user_task'])
### 3 定时任务要写在这里
# 时区
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False
# 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
'update_banner': {
'task': 'celery_task.home_task.update_banner',
'schedule': timedelta(hours=5),
'args': (),
},
# 'send_sms': {
# 'task': 'celery_task.user_task.send_sms',
# 'schedule': timedelta(seconds=5),
# # 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点
# 'args': ('1822344343', 8888),
# },
# 'add_course': {
# 'task': 'celery_task.course_task.add_course',
# # 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点
# 'schedule': crontab(hour=11, minute=38), # 每天11点35,执行
# 'args': (),
# }
}