Django中使用芹菜的教程详解

  

  

Python下有许多款不同的网框架.Django是重量级选手中最有代表性的一位。许多成功的网站和应用都基于Django。
  Django是一个开放源代码的网络应用框架,由Python写成。
  Django遵守BSD版权,初次发布于2005年7月,并于2008年9月发布了第一个正式版1.0本。
  Django采用了MVC的软件设计模式,即模型M,视图V和控制器c .

  

  

芹菜是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文芹菜入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请求处理过程都是同步的无法实现异步任务,若要实现异步任务处理需要通过其他方式(前端的一般解决方案是ajax操作),而后台芹菜就是不错的选择。倘若一个用户在执行某些操作需要等待很久才返回,这大大降低了网站的吞吐量。下面将描述Django的请求处理大致流程(图片来源于网络):

  

 Django中使用芹菜的教程详解

  

请求过程简单说明:浏览器发起请求——祝辞请求处理,在请求经过中间件——祝辞路由映射——在视图处理业务逻辑——祝辞响应请求(模板或响应)

  

  

芹菜很容易集成到Django框架中,当然如果想要实现定时任务的话还需要安装django-celery-beta插件,后面会说明。需要注意的是Celery4.0只支持Django版本祝辞=1.8的,如果是小于1.8版本需要使用Celery3.1。

  

配置   

新建立项目taskproj,目录结构(每个应用下多了个任务文件,用于定义任务):

        taskproj   ├──app01   │├──__init__ . py   │├──apps.py   │├──迁移   ││└──__init__ . py   │├──models.py   │├──tasks.py   │└──views.py   ├──jobs   ├──taskproj   │├──__init__ . py   │├──settings.py   │├──urls . py   │└──wsgi.py   └──模板      

在项目目录taskproj/taskproj目录下新建celery.py:

        # !/usr/bin/env python3   # - * -编码:utf - 8 - *   #作者:wd   从进口absolute_import __future__ unicode_literals   进口操作系统   从芹菜进口芹菜   os.environ。setdefault (“DJANGO_SETTINGS_MODULE”、“taskproj.settings”) #设置django环境   应用=芹菜(“taskproj”)   app.config_from_object (“django。相依:设置名称空间=扒鄄恕?#使用CELERY_作为前缀,在设置中写配置   app.autodiscover_tasks() #发现任务文件每个应用下的task.py      taskproj/taskproj/__init__ . py:   从进口absolute_import __future__ unicode_literals   从.celery celery_app导入应用程序   __all__=(“celery_app”)   taskproj/taskproj/settings.py   CELERY_BROKER_URL='复述://10.1.210.69:6379/0 ' #代理配置,使用复述,作为消息中间件   CELERY_RESULT_BACKEND='复述://10.1.210.69:6379/0 ' #后端配置,这里使用复述   CELERY_RESULT_SERIALIZER=' json ' #结果序列化方案      

进入项目的taskproj目录启动工人:

  

<代码>芹菜工人——taskproj - l调试代码

  

定义与触发任务

  

任务定义在每个任务文件中,app01/tasks.py:

        从进口absolute_import __future__ unicode_literals   从芹菜进口shared_task   @shared_task   def添加(x, y):   返回x + y   @shared_task   def mul (x, y):   返回x * y      

视图中触发任务

        django。http进口JsonResponse   从app01导入任务   #创建你的观点。   def指数(请求、* args * * kwargs):   res=tasks.add.delay (1、3)   #任务逻辑   返回JsonResponse({“状态”:“成功”,“task_id”: res.task_id})      

访问http://127.0.0.1:8000指数

  

 Django中使用芹菜的教程详解

  

若想获取任务结果,可以通过task_id使用AsyncResult获取结果,还可以直接通过端获取:

  

 Django中使用芹菜的教程详解

  

  

扩展   

除了复述,rabbitmq能做结果存储外,还可以使用Django的orm作为结果存储,当然需要安装依赖插件,这样的好处在于我们可以直接通过Django的数据查看到任务状态,同时为可以制定更多的操作,下面介绍如何使用orm作为结果存储。

Django中使用芹菜的教程详解