在django 2的views中使用原生celery 4和redis执行异步方法

软件版本

Celery从3.1版本以后不需要用单独的库来支持django了,可以像单独使用celery的api那样在django中使用原生celery。软件版本如下

python       3.6.6
Django       2.1.4  
celery       4.2.1
redis        4.0.10

使用方法

我参考了celery的官方文档,因为使用了python3,所以删减了一些满足python2兼容性的代码。

  1. django的项目目录如下
- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py
  - app/
    - admin.py
    - models.py
    - setting.py
    - urls.py
    - views.py
  1. 创建proj/proj/celery.py模块定义celery实例
import os
from celery import Celery

# 把置默认的django settings模块配置给celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

# 这里使用字符串以使celery的worker不用为子进程序列化配置对象。
# 命名空间 namespace='CELERY'定义所有与celery相关的配置的键名要以'CELERY_'为前缀。
app.config_from_object('django.conf:settings', namespace='CELERY')

# 从所有django app configs中加载task模块,
# 如果你把所有的task都定义在单独的tasks.py模块中,
# 加上这句话celery会自动发现这些模块中的task,实际上这句话可以省略。
app.autodiscover_tasks()
  1. proj/proj/__init__.py导入这个模块,使得django启动时加载celery的app
from proj.celery import app as celery_app

__all__ = ('celery_app',)
  1. porj/settings中配置celery
# Celery application definition
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
  1. 启动redis和celery
celery -A proj worker -l info
  1. 接下来就可以舒爽地使用celery了,在需要使用的视图处理模块(比如views.py)中
# 导入celery_app
from proj import celery_app

# 在异步执行的函数上加task装饰器
@celery_app.task
def your_function():
    pass
    
# 在视图函数中执行异步方法,
# 注意别忘了通过delay方法来实现异步调用
def index(request):
    your_function.delay()
    return HttpResponseRedirect('/')

总结

  1. django-celery已经弃用,可以直接用原生celery
  2. 以上方法不必要为异步任务创建单独的tasks.py模块,使用@celery_app.task装饰的方法会注册到celery

你可能感兴趣的:(web开发,python)