*관련 포스팅 내용

Celery + RabbitMQ + Django 참조사이트 : http://ngee.tistory.com/540

Celery + RabbitMQ + Django 연계 1        : http://ngee.tistory.com/542

Celery + RabbitMQ + Django 연계 2        : http://ngee.tistory.com/548

Celery + RabbitMQ + Django 연계 3        : http://ngee.tistory.com/549

Celery Args                                                : http://ngee.tistory.com/550

Celery Worker                                           : http://ngee.tistory.com/563

Celery Worker2                                         : http://ngee.tistory.com/564

Celery Logging                                          : http://ngee.tistory.com/567

Celery Flower                                            : http://ngee.tistory.com/566

Celery Return Value                                  : http://ngee.tistory.com/580


아래 내용은 Celery의 기본 문서에 나와있는 내용입니다.


일단 Django를 기반으로 하는 프로젝트의 구조가 아래와 같다고 가정하겠습니다.


........./ppp/
                  ┣ manage.py
                  ┗ ppp/
                             ┣ __init__.py
                             ┣ settings.py
                             ┣ urls.py
                             ┗ wsgi.py


여기서 새로운 app으로 ggg라는 app을 만들어보면 다음과 같은 구조가 되겠죠.


........./ppp/
                  ┣ manage.py
                   ppp/
                  ┃       ┣ __init__.py
                         ┣ settings.py
                         ┣ urls.py
                         ┗ wsgi.py
                  ┗ ggg/
                             ┣ __init__.py
                             ┣ models.py
                             ┣ views.py
                             ┣ ....


이런식으로 추가되었습니다. 


여기에 몇 가지 파일을 추가함으로써 Celery에서 Task를 수행할 수 있습니다. 


1. celery.py 를 생성해주세요. ..../ppp/ppp/ 하위에 위치해야 합니다. 소스코드는 아래와 같구요.


vi ...../ppp/ppp/celery.py


from __future__ import absolute_import


import os


from celery import Celery


from django.conf import settings


# set the default Django settings module for the 'celery' program.

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ggg.settings')


app = Celery('ggg')   #여기서 ggg는 task를 포함하는 app이름이 되겠습니다.


# Using a string here means the worker will not have to

# pickle the object when using Windows.

app.config_from_object('django.conf:settings')

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)



@app.task(bind=True)

def debug_task(self):

    print('Request: {0!r}'.format(self.request))


2. ..../ppp/ppp/__init__.py 수정

원래는 아무것도 작성되어 있지 않은 __init__.py 파일인데요. 그 안에 아래와 같은 소스코드를 추가해주세요.

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

3. 실제 task를 담고 있는 파일 생성... 저는 tasks.py로 생성했고 위치는 ggg 하위에 저장했습니다. 

vi .../ppp/ggg/tasks.py

from __future__ import absolute_import
from celery import shared_task

@shared_task
def add(x, y):
    return x + y

@shared_task
def mul(x, y):
    return x * y

@shared_task
def xsum(numbers):
    return sum(numbers)



이제 수행하면 되는데요. 

Celery Task를 수행할 수 있는 Worker를 생성해줘야 합니다.
터미널에서 아래 명령어로 Worker를 생성할 수 있고 상세한 Worker 설정은 Celery 홈페이지를 참고하시면 되겠습니다.

python manage.py celeryd -l info

수행방법은 views.py에서 tasks.py를 import하고 특정 주소로 사용자 요청이 왔을 때 tasks.py에 존재하는 함수를 호출하면 됩니다.
예로 아래와 같습니다.

import tasks

def test(request):
  return HttpResponse(tasks.add.delay(2,5))

주의할 점은 호출할 때 .deley로 호출한다는 겁니다.
다른 방식으로도 호출할 수 있는데요. 그것도 Celery 홈페이지를 참고해주세요. 





'파이썬(python2.7) > Django&REST' 카테고리의 다른 글

Celery Worker 1  (0) 2015.01.18
Celery Args  (0) 2015.01.10
Celery + RabbitMQ + Django 연계 3  (0) 2015.01.10
Celery + RabbitMQ + Django 연계 2  (0) 2015.01.10
Celery + RabbitMQ + Django 연계 1  (1) 2015.01.08
Celery + RabbitMQ + Django 참조사이트  (0) 2015.01.08
D005 - Django Static Files  (0) 2014.12.24
D004 - TEMPLATE_DIRS... TemplateDoesNotExist Error  (0) 2014.12.22

+ Recent posts