【问题标题】:Celery and Django simple exampleCelery 和 Django 简单示例
【发布时间】:2013-12-08 12:05:17
【问题描述】:

让我们举一个简单的 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()

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

【问题讨论】:

  • 请注意,直接请求示例往往被视为离题,因为它们通常来自之前没有做过任何研究的人。这显然不适用于您,但值得了解该一般准则 - 了解时请参阅 Help 部分。

标签: python django celery scalability


【解决方案1】:

假设您同时安装了 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

删除上面示例中的 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 运行 celery 守护进程。

在生产中,您必须使用 upstartsupervisor 或任何其他工具来设置 celery 流程本身来控制此类流程的生命周期。

更多详细信息记录在here

【讨论】:

  • 我会为此给你金色徽章!非常感谢!
  • @TeodorScorpan 谢谢 :)
  • 我花了一些时间尝试在 django admin 中显示任务后,做了这个 django-celery 模板项目:github.com/mikeumus/django-celery-example 希望它对某人有所帮助! :)
  • 这是有用的解决方案。谢谢
猜你喜欢
  • 2014-04-05
  • 2012-02-27
  • 2021-03-15
  • 2012-01-03
  • 1970-01-01
  • 2015-06-21
  • 2013-11-14
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多