celery异步任务框架( 三 )

views.pyfrom rest_framework.viewsets import ModelViewSetfrom rest_framework import mixinsfrom . import models, serializersfrom django.conf import settingsfrom rest_framework.response import Responsefrom django.core.cache import cacheclass BannerViewSet(ModelViewSet, mixins.ListModelMixin):queryset = models.Banner.objects.filter(is_delete=False, is_show=True).order_by('-orders')[:settings.BANNER_COUNT]serializer_class = serializers.BannerSerializer# 有缓存走缓存,没有缓存走数据库,然后同步给缓存 。接口自己实现def list(self, request, *args, **kwargs):banner_list = cache.get('banner_list')if not banner_list:print('走了数据库')response = self.list(request, *args, **kwargs)banner_list = response.datacache.set('banner_list', banner_list, 86400)# 存进缓存中,缓存配置了redis数据库return Response(banner_list)

celery异步任务框架

文章插图
 
启动服务'''1):先切换到celery_task所在的同级目录(一般为根目录下)2):开一个终端(启动服务):celery worker -A celery_task -l info -P eventlet3):再开一个终端(添加任务): celery beat -A celery_task -l info'''# 注):-A表示相对路径,所以一定先进入celery_task所在包-l 表示打印到日志 info 级别celery.py"""celery框架django项目工作流程1)加载django配置环境2)创建Celery框架对象app,配置broker和backend,得到的app就是worker3)给worker对应的app添加可处理的任务函数,用include配置给worker的app4)完成提供的任务的定时配置app.conf.beat_schedule5)启动celery服务,运行worker,执行任务6)启动beat服务,运行beat,添加任务重点:由于采用了django的反射机制,使用celery.py所在的celery_task包必须放置项目的根目录下"""# 一、加载django配置环境import osos.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev")# 二、加载celery配置环境from celery import Celerybroker = 'redis://:123@127.0.0.1:6379/1'backend = 'redis://:123@127.0.0.1:6379/2'# workerapp = Celery(broker=broker, backend=backend, include=['celery_task.tasks'])# 外面的包名和文件名,一般都是固定# 时区app.conf.timezone = 'Asia/Shanghai'# 是否使用UTCapp.conf.enable_utc = False# 任务的定时配置from datetime import timedeltafrom celery.schedules import crontabapp.conf.beat_schedule = {# 定时任务名字'update_banner_cache': {'task': 'celery_task.tasks.update_banner_list','args': (),'schedule': timedelta(seconds=10),# 3秒一次# 'schedule': crontab(hour=8, day_of_week=1),# 每周一早八点# 'schedule': crontab(minute=0, day_of_week=1),# 每周一早八点}}'''minute : 分钟hour :小时day_of_week :礼拜day_of_month:月month_of_year:年''''''fall_task:任务名自定义task:任务来源args:任务参数schedule:定时时间(秒)'''tasks.pyfrom .celery import appfrom django.core.cache import cachefrom home import models, serializersfrom django.conf import settings@app.taskdef update_banner_list():queryset = models.Banner.objects.filter(is_delete=False, is_show=True).order_by('-orders')[:settings.BANNER_COUNT]banner_list = serializers.BannerSerializer(queryset, many=True).data# 拿不到request对象,所以头像的连接base_url要自己组装for banner in banner_list:banner['image'] = 'http://127.0.0.1:8000%s' % banner['image']cache.set('banner_list', banner_list, 86400)return True选择了IT,必定终身学习
作者:Jeff
出处:http://dwz.date/aNfM




推荐阅读