web-dev-qa-db-fra.com

Céleri et Django exemple simple

Prenons un simple Django exemple.

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()

Quelqu'un peut-il fournir une implémentation de Celery dans cet exemple? Imaginez qu'il s'agit d'un grand projet avec des centaines de demandes par seconde.

34
Teodor Scorpan

En supposant que vous avez à la fois celery et Django-celery Python installé, créez le tasks.py fichier sous votre application:

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

Supprimez votre utils/utilities.py fichier dans votre exemple ci-dessus.

Dans votre code en views.py changer la create_user appel de:

create_user(form.cleaned_data)

à:

create_user.delay(form.cleaned_data)

Fondamentalement create_user est maintenant une tâche de céleri; si vous avez les bons Python installés (comme mentionné ci-dessus), au niveau du code (l'implémentation que vous demandez) c'est tout. delay exécute votre fonction de manière asynchrone - ie le HTTP la réponse est renvoyée sans attendre la fin de la tâche asynchrone.

Localement, vous pouvez exécuter un processus démon céleri en utilisant python manage.py celeryd.

En production, vous devez configurer le processus de céleri lui-même en utilisant par exemple upstart, supervisor ou tout autre outil pour contrôler le cycle de vie d'un tel processus.

Plus de détails documentés ici .

79