0x01 环境
python3.6+
Repo:https://github.com/Cooolis/CooolisGather
0x02 主要库安装
pip install celery==3.1.26.post2
pip install celery-with-redis==3.0
pip install Django
pip install redis==2.10.6
首先创建一个Django项目,再创建一个app。
django-admin startproject CooolisGather
django-admin startapp gather
修改Settings添加BROKER:
BROKER_URL = 'redis://127.0.0.1:6379/0'

0x03 配置celery
在CooolisGather目录文件夹下新建一个celery.py文件:
from __future__ import absolute_import
import os
import django
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CooolisGather.settings')
django.setup()
app = Celery('CooolisGather')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
0x04 配置tasks
在gather目录下新建tasks.py:
from CooolisGather.celery import app
from .tasks_handle.port_scan_handle import PortScanTask
@app.task(base=PortScanTask)
def hello_world():
print('Hello World')
第一行主要是为了让gather找到celery的配置。
tasks_handle主要是为了在触发tasks时能有其他功能,例如下发了一个端口扫描任务,任务触发了hello_world,那么在执行完毕需要将扫描结果写入数据库等操作,这种需求下就可以让@app.task继承base=PortScanTask。
0x05 调用tasks
更改gather/views.py:
from django.http import HttpResponse
from .tasks import hello_world
def index(request):
hello_world.delay()
return HttpResponse('Hello')
其中delay()方法主要用于异步执行。
0x06 遇到的坑
1.redis库版本不能太高 2.使用pycharm进行调试celery时,启动celery它默认是调用的系统库,而不是env
0x07 启动项目
~# celery worker -A CooolisGather -l debug
~# python manage.py runserver 8080

访问主页将会调用tasks.hello_word,而tasks.hello_word有继承于PortScanTask:
from celery import Task
class PortScanTask(Task):
def on_success(self, retval, task_id, args, kwargs):
print("Done")
return super(PortScanTask, self).on_success(retval, task_id, args, kwargs)

tasks.hello_word在执行完毕任务后,会自动调用on_success。