【问题标题】:Using Ajax with celery task将 Ajax 与 celery 任务一起使用
【发布时间】:2015-10-19 21:05:12
【问题描述】:

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

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


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

这是我的一些代码。它没有多大作用,因为我仍然要掌握使用 ajax 的概念。但我想要的是,当我提交表单时,会出现微调器 gif,同时 celery 会处理我的任务。当 celery 完成任务处理后,它会重定向到显示“成功”或其他任何内容的页面。

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

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

【问题讨论】:

    标签: javascript jquery ajax django celery


    【解决方案1】:

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

    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 可以轻松地做到这一点,也不需要太多的代码。 谢谢

    【讨论】:

    • 感谢您的回复!这部分是我想知道的The client side (javascript) would make a GET request for example to /check_status/ and pass the "task_id" to the server.我看到了一些例子,但没有一个告诉我如何在客户端做到这一点。我查看了你提供的链接,我发现它只适用于 django 1.3 -1.5 .. 这可能适用于 1.8 吗?
    • 没有问题:)。该项目旨在将此link 用于Javascript。我认为他们应该与尚未与该版本一起使用的 django1.8 一起使用。但是,您可以查看我刚刚编写的那个链接,看看 javascript 是如何工作的,对于服务器端,您已经有了一个想法(给定“task_id”,您可以从与该任务相关的 celery 信息中获取 =D) .总之,您可以自己做,也可以一起尝试这些库。告诉我进展如何,谢谢!
    • 天哪。我想这就是我要找的东西。我会试一试,如果顺利的话会回复你。
    • 发现 github.com/PolicyStat/celeryjs 与我正在寻找的东西有某种关联。
    • 你好。但是有一个问题,我会在哪里调用带有 ajax 的 html?根据我上面的代码,ajax应该去哪里?在 addUser.html 或 loading.html 中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2011-01-08
    相关资源
    最近更新 更多