我们来看一个简单的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()
在这个例子中,有人可以提供Celery的实现吗?想象一下,这是一个每秒有数百个请求的大型项目。
答案 0 :(得分:78)
假设您同时安装了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
运行celery守护进程。
在生产中,您必须使用例如upstart
,supervisor
或任何其他工具来设置芹菜过程本身,以控制此过程的生命周期。
详细记录了here。