您的位置:首页 > 脚本大全 > > 正文

django常用模块(django celery redis使用具体实践)

更多 时间:2021-10-20 08:40:26 类别:脚本大全 浏览量:1573

django常用模块

django celery redis使用具体实践

环境准备

  • python3.5.4
  • windows redis
  • pip install celery
  • pip install redis

windows下启动redirs server

redis-server.exe redis.windows.conf

django常用模块(django celery redis使用具体实践)

celery配置

项目的settings.py文件修改:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • # celery 设置
  • # celery中间人 redis://redis服务所在的ip地址:端口/数据库号
  • broker_url = 'redis://127.0.0.1:6379/0'
  • # celery结果返回,可用于跟踪结果
  • celery_result_backend = 'redis://127.0.0.1:6379/0'
  •  
  • # celery内容等消息的格式设置
  • celery_accept_content = ['application/json', ]
  • celery_task_serializer = 'json'
  • celery_result_serializer = 'json'
  •  
  • # celery时区设置,使用settings中time_zone同样的时区
  • celery_timezone = time_zone
  • 项目文件夹下添加celery.py文件:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • # coding:utf-8
  • from __future__ import absolute_import, unicode_literals
  •  
  • from celery import celery
  • from django.conf import settings
  • import os
  •  
  • # 获取当前文件夹名,即为该django的项目名
  • project_name = os.path.split(os.path.abspath('.'))[-1]
  • project_settings = '%s.settings' % project_name
  •  
  • # 设置环境变量
  • os.environ.setdefault('django_settings_module', project_settings)
  •  
  • # 实例化celery,网上很多教程这里都是没有设置broker造成启动失败
  • app = celery('tasks', broker='redis://127.0.0.1:6379/0')
  •  
  • # 使用django的settings文件配置celery
  • app.config_from_object('django.conf:settings')
  •  
  • # celery加载所有注册的应用
  • app.autodiscover_tasks(lambda: settings.installed_apps)
  • 项目的init.py文件修改:

  • ?
  • 1
  • 2
  • 3
  • 4
  • # 引入celery实例对象
  • from __future__ import absolute_import, unicode_literals
  • from .celery import app as celery_app
  • __all__ = ['celery_app]
  • 测试代码

    • 如:在app01(项目名)/tasks.py:
    • 关于task,并不是一定要把所有的task放在tasks.py,可以放在其他类里面,只要在函数上加@task即可
  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • import time
  • from celery import task
  • @task
  • def add(a,b):
  •   print("这是任务开始")
  •   print(a+b)
  •   time.sleep(10)
  •   print("这是任务结束")
  • url配置如下:

  • ?
  • 1
  • path('add', views.add, name="add")
  • view代码

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • from . import tasks
  • def add(request,*args,**kwargs):
  •   tasks.add.delay(1,2)
  •   result = {'code': 0, 'msg': '这是一个后台任务'}
  •   return jsonresponse(result)
  • 再次配置

    在manger.py目录执行下面的代码,注意网上的资料大部分执行的命令有问题,造成启动报错,比如这个就是错误的, python manage.py celery -a celery worker --loglevel=info ,请用下面的命令

  • ?
  • 1
  • celery -a djangoapi worker --pool=solo -l info
  • 启动项目, python manager.py runserver 0.0.0.0:8081

    运行项目

    访问add

    django常用模块(django celery redis使用具体实践)

    查看关键日志

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • [tasks]
  •  . api.base.baseviewtask.task_run
  •  . api.tasks.add
  •  
  • [2019-04-07 13:26:02,855: info/mainprocess] connected to redis://127.0.0.1:6379/0
  • [2019-04-07 13:26:02,869: info/mainprocess] mingle: searching for neighbors
  • [2019-04-07 13:26:03,911: info/mainprocess] mingle: all alone
  • [2019-04-07 13:26:03,926: warning/mainprocess] e:\app\python35\lib\site-packages\celery\fixups\django.py:202: userwarning: using settings.debug leads to a memory leak, never use this setting in production environments!
  •  warnings.warn('using settings.debug leads to a memory leak, never '
  • [2019-04-07 13:26:03,926: info/mainprocess] celery@pc-20181208qwqo ready.
  • [2019-04-07 13:29:56,889: info/mainprocess] received task: api.tasks.add[9fd98fd0-50ae-427f-8f33-52d1e4b43068]
  • [2019-04-07 13:29:56,894: warning/mainprocess] 这是任务开始
  • [2019-04-07 13:29:56,895: warning/mainprocess] 3
  • [2019-04-07 13:30:06,896: warning/mainprocess] 这是任务结束
  • [2019-04-07 13:30:06,898: info/mainprocess] task api.tasks.add[9fd98fd0-50ae-427f-8f33-52d1e4b43068] succeeded in 10.0s: none
  • 其他

    如何结合前端,如ajax来联合使用?

    • 表中我加了个extend字段,每次在执行耗时任务后,页面按钮根据extend字段值进行判断
    • 如1表示执行中,0表示没有执行,2执行完成,来判定按钮是否可以再次点击等

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。

    原文链接:https://www.jianshu.com/p/0fe3479f5f3f

    标签:redis django Celery
    您可能感兴趣