web-dev-qa-db-ja.com

セロリとDjango=簡単な例

簡単な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秒あたり数百のリクエストがある大規模なプロジェクトを想像してください。

34
Teodor Scorpan

Pythonの celeryDjango-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を使用してセロリデーモンプロセスを実行できます。

本番環境では、たとえばupstartsupervisor、またはそのようなプロセスのライフサイクルを制御する他のツールを使用して、セロリプロセス自体を設定する必要があります。

詳細なドキュメント here

79