Celery with django - pai-plznw4me/django-initializer GitHub Wiki

1. redis docker (broker, Message Queue)

1.1 install redis docker

docker pull redis

1.2 run redis docker

docker run --name some-redis -d -p 6379:6379 redis

1.3 redis μž‘λ™ ν™•μΈν•˜κΈ°

brew install redis
redis-cli ping
>>> PONG

reference
redis official installation guide

2. django setting

2.1 django_celery_results app μΆ”κ°€

pip install celery
pip install django-celery-results
INSTALLED_APPS = [
 ...
'django_celery_results',
]

2.2 celery.py μΆ”κ°€

|-project
   |-project
       |- celery.py <- 여기에닀가 μΆ”κ°€ν•˜κΈ°
   |- app 
   |- manage.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'βš οΈν”„λ‘œμ νŠΈμ΄λ¦„.settings')
app = Celery('βš οΈν”„λ‘œμ νŠΈμ΄λ¦„')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

2.3 celery-django setting

# CELERY setting
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_CACHE_BACKEND = 'django-cache'
CELERY_TIMEZONE = 'Asia/Seoul'
CELERY_TASK_TIME_LIMIT = 30 * 60

# pickle serialize
CELERY_ACCEPT_CONTENT = ['pickle', 'json']
CELERY_TASK_SERIALIZER = 'pickle'

2.4 init.py 에 celery μ‹œμž‘ μ½”λ“œ 등둝

|-project
   |-project
       |- celery.py
       |- __init__.py <- 여기에닀가 μΆ”κ°€ν•˜κΈ°
   |- app 
   |- manage.py
from .celery import app as celery_app

__all__ = ('celery_app', )

3. tasks.py 생성 및 celery task 생성

ν•΄λ‹Ή μ˜ˆμ œμ—μ„œλŠ” celery task 을 μˆ˜ν–‰ν•΄ hello world 을 찍어본닀.

- project
 |-app
   |-tasks.py <- 여기에닀가 celery task 등둝 

3.1 tasks.py

@shared_task(bind=True)
def hello_celery(self, username):
    print("hello" + username)
    return 'done'

3.2 views.py

  • view 을 μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 기본적인 setting은 μƒλž΅ν•œλ‹€.
def celery_test(requestNone):
    username = 'song kim'
    celery_id = hello_celery.delay(username)
    print(celery_id)
    return HttpResponse(200)

4. celery μ‹€ν–‰

|-project
   |-project
       |- celery.py
       |- __init__.py <- 여기에닀가 μΆ”κ°€ν•˜κΈ°
   |- app 
   |- manage.py

celery -A MARP worker -c 2 -l info 

5. Result

  • postman request
  • django server μ—μ„œ 얻은 console 둜그

Reference

official guide