簡単なDjango=の例を見てみましょう。
app/models.py
from Django.db import models
from Django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
token = models.CharField(max_length=32)
app/views.py
from Django.http import HttpResponse
from Django.views.decorators.csrf import csrf_exempt
from forms import RegisterForm
from utils.utilities import create_user
@csrf_exempt
def register_view(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
create_user(form.cleaned_data)
return HttpResponse('success')
utils/utilities.py
def create_user(data):
user = User.objects.create_user(username=data['username'], email=None, password=data['password'])
user.save()
profile = UserProfile()
profile.user = user
profile.token = generate_token()
profile.save()
この例で誰かがCeleryの実装を提供できますか?これが1秒あたり数百のリクエストがある大規模なプロジェクトを想像してください。
Pythonの celery と Django-celery の両方がインストールされていると仮定して、アプリの下に次のtasks.py
ファイルを作成します。
utils/tasks.py
from celery import task
# other imports
@task()
def create_user(data):
user = User.objects.create_user(
username=data['username'], email=None, password=data['password']
)
user.save()
profile = UserProfile()
profile.user = user
profile.token = generate_token()
profile.save()
return None
上記の例でutils/utilities.py
ファイルを削除します。
views.py
のコードで、create_user
呼び出しを以下から変更します。
create_user(form.cleaned_data)
に:
create_user.delay(form.cleaned_data)
基本的に、create_user
はセロリのタスクになりました。正しいPythonパッケージがインストールされている場合(上記のように)、コード単位(要求する実装)である場合] delay
は、関数を非同期に実行します-つまり、HTTP非同期タスクの完了を待たずに応答が返されます。
ローカルでは、python manage.py celeryd
を使用してセロリデーモンプロセスを実行できます。
本番環境では、たとえばupstart
、supervisor
、またはそのようなプロセスのライフサイクルを制御する他のツールを使用して、セロリプロセス自体を設定する必要があります。
詳細なドキュメント here 。