2020/11/04:celery相关知识
celery流程
处理异步–django-celery:
"""
Django == 2.2.6
django-celery == 3.3.1
django-redis == 4.11.0
redis == 2.10.6
celery == 3.1.26
"""
import django
djcelery.setup_loader()
BROKER_URL = "redis://127.0.0.1:6379/2"
INSTALLED_APPS = [
...
"djcelery",
...
]
python manage.py migrate
#如若不成功可以尝试一下命令语句
#python manage.py syncdb
from celery import task
@task
def add(x, y):
return x * y
a、当settings.py中的djcelery.setup_loader()运行时, Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件, 找到标记为task的function, 并将它们注册为celery task.
b、在执行djcelery.setup_loader()时, task是以INSTALLED_APPS中的app名, 加.tasks.function_name注册的
c、一次需要注意 在impprt task时, 需要保持一致
d、如果我们由于python path不同而使用不同的引用方式时(例如在tasks.py中使用from myproject.myapp.tasks import add形式), Celery将无法得知这是同一task, 因此可能会引起奇怪的bug。
from userapp.tasks import add
class TestCeleryView(APIView):
def get(self,request):
data = add.delay(2,10) #delay是注册为celery异步任务的关键点
return Response({"code":200})
# 先启动Django任务在启动celery服务
# python manage.py celery worker --loglevel=info
注册:
class RegisterUserView(APIView):
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
phone = request.data.get('phone')
code = request.data.get('code')
if not all([username, password, phone, code]):
return Response({
'code': 4003,
'msg': '数据不完整!'
})
redis_cli = get_redis_connection('image_code')
redis_phone_code = redis_cli.get(phone).decode()
if redis_phone_code != code:
return Response({
'code': 4005,
'msg': '验证码错误!'
})
user_ser = UserSerializer(data=request.data)
if user_ser.is_valid():
user_ser.save()
return Response({
'code': 200,
'msg': '注册成功!'
})
else:
return Response({
'code': 500,
'msg': "注册失败!",
'data': user_ser.errors,
})