2013-11-23 12 views
33

Facciamo un semplice esempio di Django.Esempio semplice di Celery e 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() 

Qualcuno può fornire un'implementazione di sedano in questo esempio ? Immagina che questo sia un grande progetto con centinaia di richieste al secondo.

+1

Proprio per quello che sai, le richieste dirette di esempi tendono a essere considerate off-topic, in quanto vengono spesso da persone che non hanno fatto ricerche precedenti. Questo chiaramente non si applica a te, ma vale la pena essere consapevoli di questa linea guida generale - vedi la sezione [Aiuto] (http://stackoverflow.com/help) quando ottieni un risultato. – halfer

risposta

76

Dando per scontato che hanno entrambi di Python celery e django-celery installato, creare il file di tasks.py seguente sotto la vostra applicazione:

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 

Eliminare il file utils/utilities.py nel tuo esempio sopra.

Nel codice in views.py cambiamento del create_user chiamata da:

create_user(form.cleaned_data) 

a:

create_user.delay(form.cleaned_data) 

Fondamentalmente create_user è ora un compito di sedano; se hai i giusti pacchetti Python installati (come menzionato sopra), in termini di codice (l'implementazione che chiedi) è tutto. delay esegue la funzione in modo asincrono, ovvero la risposta HTTP viene restituita senza attendere il completamento dell'attività asincrona.

Localmente è possibile eseguire una procedura di daemon di tipo sedan utilizzando python manage.py celeryd.

Nella produzione è necessario impostare il processo di sedimentazione stesso utilizzando ad esempio upstart, supervisor o qualsiasi altro strumento per controllare il ciclo di vita di tale processo.

Ulteriori dettagli documentati here.

+0

Ti darei dei badge dorati per questo! Grazie mille! –

+0

@TeodorScorpan Grazie :) –

+2

Ho fatto questo progetto modello django-sedano dopo aver trascorso un po 'di tempo a cercare di ottenere attività mostrate in admin django: https://github.com/mikeumus/django-celery-example Spero che aiuti qualcuno ! :) – Mikeumus