2013-11-23 2 views
33

Давайте рассмотрим простой пример Django.Пример простого сельдерея и Django

приложение/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) 

приложение/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() 

Может кто-нибудь обеспечить реализацию сельдерея в этом примере ? Представьте, что это большой проект с сотнями запросов в секунду.

+1

Как вы знаете, прямые запросы на примеры, как правило, рассматриваются как не относящиеся к теме, поскольку они часто происходят от людей, которые еще не проводили никаких исследований. Это явно не относится к вам, но стоит знать об этом общем руководстве - см. Раздел [Помощь] (http://stackoverflow.com/help), когда вы получаете mo. – halfer

ответ

76

Предполагая, что вы оба языка Python celery и django-celery установлен, создайте следующий tasks.py файл под вашим приложением:

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

+0

Я бы дал тебе золотые значки для этого! Спасибо! –

+0

@TeodorScorpan Спасибо :) –

+2

Я сделал этот проект шаблона django-celery, потратив некоторое время на попытку получить задания, появляющиеся в django admin: https://github.com/mikeumus/django-celery-example Надеюсь, это поможет кому-то ! :) – Mikeumus

Смежные вопросы