将Ajax与芹菜任务

时间:2015-07-29 04:02:53

标签: javascript jquery ajax django celery

我对如何继续我的计划感到有点困惑。我有一个django视图,要求用户输入名字和姓氏,然后这将转到芹菜任务,该任务处理数据并将其保存到数据库。现在,当任务正在处理时,我希望显示一个动画gif,这样用户就会知道发生了什么事情。(我在这里读到了某处,动画gif更好)然后如果任务完成,它将重定向到一个页面,告诉用户该过程已完成。我完成了我的研究,发现我应该得到task_id并将其发送给ajax请求。

我的问题是如何使用ajax。如何从ajax获取task_id?或者将task_id传递给ajax请求。

编辑:  **我知道这是不完整的。非常不完整**

以下是我的一些代码。它没有做太多,因为我仍然需要掌握使用ajax的概念。但我想要的是当我提交表格时,旋转器gif会出现,同时,芹菜将处理我的任务。当芹菜处理完任务后,它将重定向到一个显示“成功”或其他任何内容的页面。

views.py:

def addUser(request):
    if request.method == 'POST':
       addUser = userform(request.POST)
       if addUser.is_valid():
            task = create_user.apply_async((addUser.cleaned_data,), countdown=20)
       return render_to_response('loading.html', {'task_id': task.task_id})
    else:
       addUser = userform()
    return render(request, 'addUser.html', {'addUser':addUser})

addUser.html

<form method="POST">
    {% csrf_token %}
    {{ addUser }}
    <input type="submit" value="Submit">  
</form>

loading.html

<html>
<script>
<head>
<script src="{{ STATIC_URL }}js/jquery-ui.min.js"></script>
<script type="text/javascript">
var formData = task_id; // task id of my celery task

$.ajax({
    url : "templates/success.html", //from what I know, this URL is where the AJAX will go after processing
    type: "POST",
    data : formData,
    success: function(data, textStatus, jqXHR)
    {
        alert("Success")
    },
    error: function (jqXHR, textStatus, errorThrown)
    {
        alert("Failed")
    }
});
</script>

</head>

<body><center>
    {% load static %}
    <img src="{% static 'images/ripple.gif' %}" alt="Hi!" height="150" width="150" />
    </center>
</body>
</html>

tasks.py

@task(ignore_result=True)
def create_user(data):
    user = UserInfo(fname=data['fname'], lname=data['lname'])
    user.save()
    return None

我不确定AJAX会去哪里,如果它在form(addUser.html)loading.html

如果我错了,请纠正我。谢谢你的帮助!

1 个答案:

答案 0 :(得分:5)

想法是启动长时间运行的任务,当你执行一个任务时,它返回一个AsyncResult对象,你必须获得“task_id”并将其返回给客户端。 客户端(javascript)将向/ check_status /发出GET请求,并将“task_id”传递给服务器。 服务器将使用该task_id询问芹菜并在任务完成时返回客户端。

def view_with_task(request):
     #your code
     # send the task to the worker and get the task_id
     async_result = your_task.delay()
     #code
     ctx = {}
     ctx['task_id'] = async_result.task_id
     return render(tpl, ctx)

from celery import AsyncResult
def check_status(request):
    task_id = request.GET.get('task_id')
    if task_id:
        async_result = AsyncResult(task_id)
        return Jsonresponse({'finish': async_result.ready()})
    return JsonResponse({'finish': False})
顺便说一下,有一个project可以做到这一点,没有痛苦,也没有太多的代码。 感谢