Django 에서 비동기 작업 의 django-celery 를 자세히 설명 합 니 다.
8855 단어 Django비동기 임무django-celery
https://www.jb51.net/article/158046.htm
Django 에서 비동기 작업
Celery 간단 한 소개:
celery 사용 필드:
먼저,Celery 는 강력 한 분포 식 작업 대기 열 로 작업 의 실행 을 주 프로그램 에서 완전히 벗 어 나 다른 호스트 에서 실 행 될 수 있 습 니 다.우 리 는 보통 그것 을 사용 하여 비동기 작업(asynctask)과 정시 작업(crontab)을 실현 합 니 다.그것 의 구 조 는 다음 과 같다.
Celery 는 주로 다음 과 같은 몇 가지 모듈 을 포함 합 니 다.
퀘 스 트 모듈 작업
비동기 작업 과 정시 작업 을 포함 합 니 다.그 중에서 비동기 작업 은 보통 업무 논리 에서 작업 대기 열 로 동시 다발 되 고 정시 작업 은 Celery Beat 프로 세 스 가 주기 적 으로 작업 대기 열 로 보 냅 니 다.
메시지 중간 부품 브로커
Broker,즉 퀘 스 트 스케줄 링 대기 열 입 니 다.퀘 스 트 생산자 가 보 낸 메시지(즉 퀘 스 트)를 받 고 퀘 스 트 를 대기 열 에 저장 합 니 다.셀 러 리 자 체 는 대기 열 서 비 스 를 제공 하지 않 고 래 빗 MQ 와 레 디 스 등 을 공식 추천 합 니 다.
작업 수행 단위 Worker
Worker 는 작업 을 수행 하 는 처리 장치 로 메시지 대기 열 을 실시 간 으로 감시 하고 대기 열 에 있 는 작업 을 가 져 와 수행 합 니 다.
작업 결과 저장 소 Backend
Backend 는 조회 할 수 있 도록 작업 의 실행 결 과 를 저장 하 는 데 사 용 됩 니 다.메시지 미들웨어 와 마찬가지 로 저장 에 도 RabbitMQ,Redis,MongoDB 등 을 사용 할 수 있다.
p>django-celery
우선 사용 환경 을 통일 시 켜 야 합 니 다.redis 버 전이 너무 높 으 면 잘못 보고 할 것 이 라 고 생각 합 니 다.
해결 방법:redis 버 전 을 낮 추 는 것 을 권장 합 니 다.
추천 버 전
Django == 2.2.6
django-celery == 3.3.1
django-redis == 4.11.0
redis == 2.10.6
celery == 3.1.26.post2
의존 설치:pip install.... 명 이 다 알 고 있 습 니 다.
1.setting.py django 프로필 을 수정 하고 다음 과 같이 추가 합 니 다.
import djcelery ###
djcelery.setup_loader() ###
BROKER_URL = 'redis://127.0.0.1:6379/2'
# BROKER_URL='redis://192.168.217.77:16379/2' # redis , django server
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' ###
INSTALLED_APPS = [
...
"djcelery", # djcelery
...
]
CELERY_TIMEZONE='Asia/Shanghai' # , TIME_ZONE
TIME_ZONE='Asia/Shanghai' #
시작 부분 에 위의 설정 파일 을 추가 하고 실제 상황 에 따라 redis 의 주소 와 포트 를 설정 하 며 시간 대 는 반드시 Asia/Shanghai
으로 설정 해 야 합 니 다.그렇지 않 으 면 시간 이 정시 임무 의 운행 에 영향 을 주지 않 는 다.위의 코드 는 먼저 djcelery 모듈 을 내 보 내 고 setup 을 호출 합 니 다.loader 방법 으로 관련 설정 불 러 오기;시간 대 설정 에 주의 하 십시오.그렇지 않 으 면 기본적으로 UTC 를 사용 하 는 시간 이 동 8 구 보다 8 시간 느 립 니 다.그 중 INSTALLEDAPPS 말미 에 celery 서비스 와 자신 이 정의 한 apps 서 비 스 를 추가 하 는 것 을 나타 내 는 두 가지 항목 을 추가 합 니 다.
2.Celery 에 필요 한 데이터 시트 만 들 기
python manage.py migrate
#
#python manage.py syncdb
3.task 만 들 기stasks.py
# -*- coding: utf-8 -*-
import json, time
from syl.settings import ALY_ACCESSKEY_ID, ALY_ACCESSKEY_SECRET
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from celery import task
#
@task
def Celery_Send_Sms(phone, data):
client = AcsClient(ALY_ACCESSKEY_ID, ALY_ACCESSKEY_SECRET, 'cn-hangzhou')
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('dysmsapi.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https') # https | http
request.set_version('2017-05-25')
request.set_action_name('SendSms')
request.add_query_param('RegionId', "cn-hangzhou")
request.add_query_param('PhoneNumbers', phone)
request.add_query_param('SignName', " ")
request.add_query_param('TemplateCode', "SMS_205397849")
request.add_query_param('TemplateParam', data)
response = client.do_action(request)
time.sleep(10)
print(str(response, encoding='utf-8'))
res = json.loads(str(response, encoding='utf-8'))
#celery
# python manage.py celery worker --loglevel=info
예 를 들 어 저 희 는 사용자 가 request 를 보 낸 후에 이 task 를 비동기 로 실행 하고 즉시 response 로 돌아 가 이 request 를 막 지 않 고 사용자 로 하여 금 유창 한 방문 과정 을 가지 게 하 기 를 바 랍 니 다.그러면 저 희 는'delay'를 사용 할 수 있 습 니 다.
views.py
import re
import random
from rest_framework.permissions import AllowAny
from django_redis import get_redis_connection
from rest_framework.views import APIView
from rest_framework.response import Response
# from utils.MyBaseView import send_message, Send_Sms
from verifications.stasks import Celery_Send_Sms
#
class SmsCodeView(APIView):
''' apiview '''
# 1.
permission_classes = (AllowAny,)
def post(self, request):
# 1.
phone = request.data.get('phone') #
image_code = request.data.get('image_code') #
image_code_uuid = request.data.get('image_code_uuid') # uuid, redis key
# 2.
if not all([phone, image_code, image_code_uuid]):
return Response({'code': 400, 'msg': ' '})
#
if not re.match(r'^1[3456789]\d{9}$', phone):
return Response({"code": 999, "msg": " "})
# 3.
redis_client = get_redis_connection('img_code') # redis
# phone_exists = redis_client.get(phone)
# if phone_exists:
# return Response({"code": 999, "msg": " , "})
# 4.
redis_image_code = redis_client.get(image_code_uuid) #
if redis_image_code:
# bytes string
redis_image_code = redis_image_code.decode() # uuid
# redis
if image_code.upper() != redis_image_code:
return Response({'code': 999, 'msg': ' '})
# 5.
code = '%06d' % random.randint(100000, 999999) # 6
print('code===============================================', code)
#
# send_resp = send_message(phone, (code, "5"))
#
data = {'code': code}
# send_resp = Send_Sms(phone, data)
# celery
Celery_Send_Sms.delay(phone, data) #delay celery
# Celery_Send_Sms(phone, data) # delay celery
# 5.1 code redis
redis_client.setex(phone, 60 * 5, code) # phone:code, 5
# 5.2 redis ,
redis_client.delete(image_code_uuid)
# 6. , ( pipeline )
pl = redis_client.pipeline()
pl.setex(phone, 60 * 5, code)
pl.delete(image_code_uuid)
pl.execute()
# 7.
return Response({"code": 200, "msg": " "})
1.celery 시작먼저 django 작업 을 정상적으로 시작 한 다음 celery 서 비 스 를 시작 하면 됩 니 다.
python manage.py celery worker --loglevel=info
위의 그림 이 나타 나 면 슈퍼 관리자 가 시작 하지 못 하 게 하고 settings.py 에 다음 설정 을 추가 합 니 다.
from celery import Celery, platforms
platforms.C_FORCE_ROOT = True
2.celery 퀘 스 트 검증위의 물건 을 처리 한 후에,당신 은 postman 을 통 해 인 터 페 이 스 를 celery 로 하여 금 다른 단계 로 임 무 를 수행 하 게 하고,당신 의 request 요청 을 막 지 않도록 요청 할 수 있 습 니 다.
Django 의 비동기 임 무 를 자세히 설명 하 는 django-clery 에 관 한 글 은 여기까지 입 니 다.더 많은 Django 비동기 임무 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.