Подтвердить что ты не робот

Пример простого сельдерея и 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()

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

4b9b3361

Ответ 1

Предполагая, что у вас установлены как Python celery, так и django-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.

В процессе производства вам необходимо настроить сам процесс сельдерея, используя, например, upstart, supervisor или любой другой инструмент для управления жизненным циклом такого процесса.

Подробнее о документах здесь.