芹菜和Django简单的例子

Teo*_*pan 34 python django scalability celery

我们来看一个简单的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)
Run Code Online (Sandbox Code Playgroud)

应用程序/ 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')
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

在这个例子中,有人可以提供Celery的实现吗?想象一下,这是一个每秒有数百个请求的大型项目.

Jos*_*mit 79

假设您同时安装了Python的celerydjango-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
Run Code Online (Sandbox Code Playgroud)

utils/utilities.py在上面的示例中删除您的文件.

在您的代码中views.py更改create_user来自以下的调用:

create_user(form.cleaned_data)
Run Code Online (Sandbox Code Playgroud)

至:

create_user.delay(form.cleaned_data)
Run Code Online (Sandbox Code Playgroud)

create_user现在基本上是一个芹菜任务; 如果你安装了正确的Python包(如上所述),那就是代码(你要求的实现).delay异步执行您的函数 - 即返回HTTP响应而不等待异步任务完成.

在本地,您可以使用celery守护程序进行运行python manage.py celeryd.

在生产中,您必须使用例如或任何其他工具来设置芹菜过程upstart,supervisor以控制此过程的生命周期.

此处记录更多细节.

  • 我花了一些时间试图让任务显示在django管理员中,我做了这个django-celery模板项目:https://github.com/mikeumus/django-celery-example希望它可以帮到某人!:) (2认同)