Django 에서 Celery 를 사용 하 는 튜 토리 얼 에 대한 상세 한 설명

10401 단어 djangocelery
Django 튜 토리 얼
Python 아래 에는 다양한 웹 프레임 워 크 가 있 습 니 다.장 고 는 헤비급 선수 중 대표 적 이다.많은 성공 적 인 사이트 와 앱 은 모두 Django 를 바탕 으로 한다.
Django 는 오픈 소스 코드 의 웹 응용 프레임 워 크 로 Python 에서 작성 합 니 다.
Django 는 BSD 저작권 을 준수 하 며 2005 년 7 월 에 처음 발 표 했 고 2008 년 9 월 에 첫 번 째 정식 버 전 1.0 을 발표 했다.
Django 는 MVC 의 소프트웨어 디자인 모델,즉 모델 M,보기 V 와 컨트롤 러 C 를 사용 했다.
머리말
Celery 는 python 을 기반 으로 개발 한 분포 식 작업 대기 열 입 니 다.필자 의 이전 블 로그 인 Celery 입문 과 진급 을 읽 으 십시오.python WEB 개발 에서 가장 유행 하 는 프레임 워 크 는 Django 입 니 다.그러나 Django 의 요청 처리 과정 은 동기 화 되 어 비동기 작업 을 수행 할 수 없습니다.비동기 작업 처 리 를 실현 하려 면 다른 방식(전단 의 일반적인 해결 방안 은 ajax 작업)을 통 해 이 루어 져 야 하 며,배경 셀 러 리 는 좋 은 선택 입 니 다.만약 한 사용자 가 어떤 조작 을 수행 하 는 데 오래 기 다 려 야 돌아 오 면 사이트 의 스루풋 을 크게 낮 출 수 있다.다음은 Django 의 요청 처리 프로 세 스 를 설명 합 니 다.(그림 은 네트워크 에서 유래 합 니 다.)

요청 프로 세 스 간단 한 설명:브 라 우 저 요청-->요청 처리-->중간 부품 요청->루트 맵-->보기 처리 업무 논리-->응답 요청(template 또는 response)
2.설정 사용
celery 는 Django 프레임 워 크 에 쉽게 통합 되 며,물론 정시 작업 을 수행 하려 면 django-celery-beta 플러그 인 을 설치 해 야 합 니 다.나중에 설명 할 것 입 니 다.주의해 야 할 것 은 Celery 4.0 은 Django 버 전 만 지원 합 니 다>=1.8 의 경우 1.8 보다 작은 버 전이 라면 Celery 3.1 을 사용 해 야 합 니 다.
배치 하 다.
프로젝트 taskproj,디 렉 터 리 구 조 를 새로 만 듭 니 다.

taskproj
├── app01
│ ├── __init__.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tasks.py
│ └── views.py
├── manage.py
├── taskproj
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── templates
프로젝트 디 렉 터 리 taskproj/taskproj/디 렉 터 리 에 celery.py 를 새로 만 듭 니 다.

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:wd
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'taskproj.settings') #   django  
app = Celery('taskproj')
app.config_from_object('django.conf:settings', namespace='CELERY') #   CELERY_     , settings    
app.autodiscover_tasks() #         app  task.py

taskproj/taskproj/__init__.py:
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']
taskproj/taskproj/settings.py
CELERY_BROKER_URL = 'redis://10.1.210.69:6379/0' # Broker  ,  Redis       
CELERY_RESULT_BACKEND = 'redis://10.1.210.69:6379/0' # BACKEND  ,    redis
CELERY_RESULT_SERIALIZER = 'json' #        
프로젝트 에 들 어 가 는 taskproj 디 렉 터 리 시작 worker:celery worker -A taskproj -l debug정의 및 트리거 작업
작업 정 의 는 모든 tasks 파일 에서 app 01/tasks.py:

from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def add(x, y):
 return x + y
@shared_task
def mul(x, y):
 return x * y
보기 에서 퀘 스 트 실행

from django.http import JsonResponse
from app01 import tasks
# Create your views here.
def index(request,*args,**kwargs):
 res=tasks.add.delay(1,3)
 #    
 return JsonResponse({'status':'successful','task_id':res.task_id})
방문

퀘 스 트 결 과 를 얻 으 려 면 taskid 는 AsyncResult 를 사용 하여 결 과 를 얻 을 수 있 고 백 엔 드 를 통 해 직접 얻 을 수 있 습 니 다.

넓히다
redis,rabbitmq 가 결과 저장 을 할 수 있 는 것 외 에 Django 의 orm 을 결과 저장 으로 사용 할 수 있 습 니 다.물론 의존 플러그 인 을 설치 해 야 합 니 다.이러한 장점 은 django 의 데 이 터 를 통 해 작업 상 태 를 직접 볼 수 있 고 더 많은 조작 을 할 수 있 습 니 다.다음 에 orm 을 결과 저장 으로 사용 하 는 방법 을 소개 합 니 다.
1.설치pip install django-celery-results2.settings.py 설정,앱 등록

INSTALLED_APPS = (
 ...,
 'django_celery_results',
)
4.backend 설정 을 수정 하고 redis 를 django-db 로 변경 합 니 다.

#CELERY_RESULT_BACKEND = 'redis://10.1.210.69:6379/0' # BACKEND  ,    redis
CELERY_RESULT_BACKEND = 'django-db' #  django orm       
5.데이터베이스 수정

python3 manage.py migrate django_celery_results
이 때 데이터 베 이 스 를 더 만 드 는 것 을 볼 수 있 습 니 다:
 
물론 task 표를 조작 해 야 할 때 가 있 습 니 다.다음 소스 코드 의 표 구조 정의:

class TaskResult(models.Model):
 """Task result/status."""
 task_id = models.CharField(_('task id'), max_length=255, unique=True)
 task_name = models.CharField(_('task name'), null=True, max_length=255)
 task_args = models.TextField(_('task arguments'), null=True)
 task_kwargs = models.TextField(_('task kwargs'), null=True)
 status = models.CharField(_('state'), max_length=50,
        default=states.PENDING,
        choices=TASK_STATE_CHOICES
        )
 content_type = models.CharField(_('content type'), max_length=128)
 content_encoding = models.CharField(_('content encoding'), max_length=64)
 result = models.TextField(null=True, default=None, editable=False)
 date_done = models.DateTimeField(_('done at'), auto_now=True)
 traceback = models.TextField(_('traceback'), blank=True, null=True)
 hidden = models.BooleanField(editable=False, default=False, db_index=True)
 meta = models.TextField(null=True, default=None, editable=False)
 objects = managers.TaskResultManager()
 class Meta:
  """Table information."""
  ordering = ['-date_done']
  verbose_name = _('task result')
  verbose_name_plural = _('task results')
 def as_dict(self):
  return {
   'task_id': self.task_id,
   'task_name': self.task_name,
   'task_args': self.task_args,
   'task_kwargs': self.task_kwargs,
   'status': self.status,
   'result': self.result,
   'date_done': self.date_done,
   'traceback': self.traceback,
   'meta': self.meta,
  }
 def __str__(self):
  return '<Task: {0.task_id} ({0.status})>'.format(self)
3.Django 에서 정시 퀘 스 트 사용
django 에서 정시 작업 기능 을 사용 하려 면 beat 로 작업 전송 기능 을 수행 해 야 합 니 다.Django 에서 정시 작업 을 사용 하려 면 django-celery-beat 플러그 인 을 설치 해 야 합 니 다.다음은 사용 과정 을 소개 한다.
설치 설정
1.beat 플러그 인 설치pip3 install django-celery-beat2.등록 앱

INSTALLED_APPS = [
 .... 
 'django_celery_beat',
]
3.데이터베이스 변경

python3 manage.py migrate django_celery_beat
4.각각 워 커 와 베타 시작

celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler #  beta         
celery worker -A taskproj -l info #  woker
5.admin 설정
urls.py

# urls.py
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
 url(r'^admin/', admin.site.urls),
]
6.사용자 만 들 기

python3 manage.py createsuperuser
7.admin 에 로그 인하 여 관리(주소http://127.0.0.1:8000/index)하고 우리 가 지난번 에 orm 을 결과 로 저장 한 표를 볼 수 있 습 니 다.
http://127.0.0.1:8000/admin

 사용 예시:


결과 보기:

이차 개발
django-celery-beat 플러그 인 은 본질 적 으로 데이터베이스 시트 변화 검사 입 니 다.데이터베이스 시트 가 바 뀌 면 스케줄 러 가 작업 을 다시 읽 고 스케줄 링 을 하기 때문에 맞 춤 형 작업 페이지 를 만 들 려 면 beat 플러그 인의 네 장의 표 만 조작 하면 됩 니 다.물론 스케줄 러 를 스스로 정의 할 수 있 습 니 다.django-clery-beat 플러그 인 은 model 이 내장 되 어 있 습 니 다.가 져 오기 만 하면 orm 작업 을 할 수 있 습 니 다.다음은 django reset api 로 예 를 들 겠 습 니 다.
settings.py

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'app01.apps.App01Config',
 'django_celery_results',
 'django_celery_beat',
 'rest_framework',
]

urls.py

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^index$', views.index),
 url(r'^res$', views.get_res),
 url(r'^tasks$', views.TaskView.as_view({'get':'list'})),
]
views.py

from django_celery_beat.models import PeriodicTask #    model
from rest_framework import serializers
from rest_framework import pagination
from rest_framework.viewsets import ModelViewSet
class Userserializer(serializers.ModelSerializer):
 class Meta:
  model = PeriodicTask
  fields = '__all__'
class Mypagination(pagination.PageNumberPagination):
 """     """
 page_size=2
 page_query_param = 'p'
 page_size_query_param='size'
 max_page_size=4
class TaskView(ModelViewSet):
 queryset = PeriodicTask.objects.all()
 serializer_class = Userserializer
 permission_classes = []
 pagination_class = Mypagination
방문http://127.0.0.1:8000/admin/login/?next=/admin/다음 과 같 습 니 다.

총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 Django 에서 Celery 를 사용 하 는 튜 토리 얼 에 대한 상세 한 설명 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기