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.
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 .