javascript – 从AJAX请求调用django视图(解析celery task_id)

我正在尝试将芹菜任务中的数据输出一个单独的窗口中.我是 JavaScript和AJAX的新手,这是我当前的问题所在.执行视图后,启动芹菜任务并呈现下一个html页面(success.html):

success.html

{% block content %}
  <body>
    {% if task_id %}
      <h1>task_id has been called: {{ task_id }}</h1>

    <script src="{% static 'MyAPP/bootstrap/js/task_output_retrieval.js' %}"></script>
    <script type='text/javascript'> task_state("{{ task_id }}"); </script>

    <script src="{% static 'MyAPP/bootstrap/js/update-hello-user.js' %}"></script>
    <script type='text/javascript'> second(); </script>

      <h1> END </h1>

    {% endif %}
  </body>
{% endblock content %}

我知道JavaScript被调用,因为窗口至少是打开的.这是.js:

task_output_retrieval.js

function task_state (task_id) {
    var taskID = task_id; 
    var newWin = window.open('','new window','width=200,height=100');

    $.ajax({
            url: '{% url validate_task_state %}',data: {'taskID':taskID},method: 'POST',dataType : "json",success: function(data){
                $(newWin.document.body).html(data);
                newWin.document.write(data);
                newWin.document.close();
                newWin.focus();
                newWin.print();
                newWin.close();
            },error: function (){ alert('An error occured'); }
    });
}

task_state(task_id);

而url.py:

url(r'^ajax/task_state/$',task_state,name='validate_task_state'),# for ajax

并且观点:

admin_scripts.py

def task_state(request):
    print ("You reached the task_state function")
    data = 'Fail' 
    task_id = request.GET.get('task_id') 
    #task_id = request.session['task_id']
    try:
        async_result = AsyncResult(task_id)
    except KeyError:
        ret = {'error':'No optimisation (or you may have disabled cookies).'}
        return HttpResponse(json.dumps(ret))

    print ("request.is_ajax(): {0}".format(request.is_ajax()))
    if request.is_ajax():
        if 'task_id' in request.POST.keys() and request.POST['task_id']:
            task_id = request.POST['task_id']
            async_result.get() 
            data = {
            'state': async_result.state,'result': async_result.result,}
            #data = async_result.result or async_result.state
            print ("data:{0}".format(data))
        else:
            data = 'No task_id in the request'
    else:
        raise SuspicIoUsOperation("This is not an ajax request.")

    json_data = json.dumps(data)
    return HttpResponse(json_data,content_type='application/json')

task_state中仍有许多未解决的问题我还没有完全理解,通过反复试验,我会到达那里,但是现在,task_state没有被调用.我怀疑的问题是AJAX调用(“url”),但我无法弄清楚原因.我哪里错了?

更新:选中“JS Test Stuff”复选框后,将呈现success.html,无错误.从success.html中调用AJAX JavaScript(task_output_retrieval.js),这是经过验证的,因为我从success.html调用了2个JavaScript文件(另一个是update-hello-user.js).打开task_output_retrieval.js的窗口,并显示update-hello-user.js的弹出窗口.它在我调用视图的task_output_retrieval.js中:

$.ajax({
                url: query_url,)

但这没有呈现.

这是控制台的输出

[17/Aug/2018 04:59:12] INFO [django.server:124] "GET /MyApp/opt/ HTTP/1.1" 200 6631
async_result f2224e67-3e47-4980-9dc8-58622928e090
TASK_ID f2224e67-3e47-4980-9dc8-58622928e090
[17/Aug/2018 04:59:14] INFO [django.server:124] "POST /MyApp/opt/ HTTP/1.1" 200 6412
[17/Aug/2018 04:59:14] INFO [django.server:124] "GET /MyAppsite-static/MyApp/bootstrap/js/update-hello-user.js HTTP/1.1" 200 52
[17/Aug/2018 04:59:14] INFO [django.server:124] "GET /MyAppsite-static/MyApp/bootstrap/js/task_output_retrieval.js HTTP/1.1" 200 640

解决方法

我在查看您的代码时遇到的问题是您在JavaScript文件中使用{%url validate_task_state%}.如果您按照最常用的建议方法来设置Django并提供其静态内容,则模板引擎将不会处理您的JavaScript文件,并且不会处理该模板标记.此外,它需要围绕其参数引用所以{%’url validate_task_state’%}

您应该更改success.html模板,将需要的URL传递给task_state函数,如下所示:

<script src="{% static 'MyAPP/bootstrap/js/task_output_retrieval.js' %}"></script>
<script type='text/javascript'> task_state("{% url 'validate_task_state' %}","{{ task_id }}"); </script>

修改您的函数获取新参数:

function task_state (query_url,task_id) {
    var taskID = task_id; 
    var newWin = window.open('',height=100');

    $.ajax({
            url: query_url,error: function (){ alert('An error occured'); }
    });
}

您在评论中说Django没有看到请求.常见问题是CSRF保护:自定义POST请求需要传递CSRF令牌,否则将被拒绝.有关如何操作的详细信息部分取决于您的具体配置,但一般来说,我这样做:

// Grab the CSRF token from the cookie.
var csrftoken = $.cookie('csrftoken');
$.ajax({
  type: "POST",url: "... my url ...",headers: {
    // Pass the token with the query.
    'X-CSrftoken': csrftoken
  },// other ajax options...
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但是在某些特殊情况下,我们可能还需要使用IE6来访问网页。而在IE6中,我们通常会使用JavaScript来提交表单,来看一下具体操作。
PHP中的count()函数是用来计算数组或容器中元素的个数。这个函数十分方便,在编写代码时使用频率也非常高。无论你是要统计数组的长度、统计字符串中字符出现的次数还是统计对象中属性的个数,count()都可以帮助你轻松
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不刷新整个页面的情况下,向服务器发送请求并接收响应。通常来说,我们使用 AJAX 请求是为了获取后台数据,并将其展示在前端页面上。然而,有时候我们只需要
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页用户体验的技术,通过与服务器进行异步通信,实现在网页上局部刷新数据而不必整个页面刷新的功能。在实际开发中,我们经常需要从服务器端下载文件,而传统
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以在不刷新整个页面的情况下,向服务器发送请求并获取响应数据。在某些场景下,我们需要通过AJAX下载Excel文件流,以便于在前端使用或保存到本地。本文将详
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax,我们可以在不刷新整个页面的情况下向服务器发送请求并获得响应数据。而在Ajax的基础上,.get和.post是两种常用的请求方法,它们分别用于发送GET和POST请
AJAX(Asynchronous JavaScript and XML)是一种在网页上实现异步数据传输的技术。通过AJAX,网页可以在不刷新整个页面的情况下与服务器进行数据交互,提升用户体验和页面性能。在实际应用中,AJAX广泛用于表单提交、
在使用Ajax下拉加载数据的过程中,有时候会出现无法取到360度的问题。这个问题可能是由于代码逻辑的问题导致的,也有可能是网络延迟引起的。为了解决这个问题,我们需要对代码进行仔细排查,并且在合适的地方添加适当
本文将介绍Ajax和.post之间的区别。Ajax是一种用于在网页上进行异步通信的技术,能够在不刷新整个页面的情况下更新部分页面内容。.post是jQuery中的一个方法,用于向服务器发送POST请求。虽然它们都可以用于发送异步
AJAX(Asynchronous JavaScript and XML)是一种在Web页面上进行异步数据请求和交互的技术。它的出现使得页面在后台与服务器进行数据交互的同时,不需要重新加载整个页面。在网页开发中,常常需要实现文件上传功能,
最近,我对于在IE浏览器中使用Ajax上传文件进行了一番研究。我发现IE浏览器对于Ajax上传文件提供了支持,并且使用起来也相对简单。事实上,我们可以使用ActiveXObject对象来实现在IE浏览器中上传文件的功能。
AJAX是一种用于在不重新加载整个网页的情况下从服务器异步传输数据的技术。它允许我们通过JavaScript与服务器进行通信,并在网页上实现动态更新。然而,在使用AJAX时,我们可能遇到跨域问题。跨域是指在浏览器中,
当涉及与跨域请求相关的Ajax开发时,我们通常会选择使用POST方法。然而,有时我们会不得不面对无法使用POST方法发送Ajax请求的情况。本文将会深入探讨造成这种限制的原因,并提供一些常见且解决此问题的方法。
Python是一种常用的编程语言,它可以用来开发各种各样的应用程序。其中,猜数字游戏算得分是Python初学者非常适合的练习项目之一。
AJAX(Asynchronous JavaScript and XML)指的是一种在客户端和服务器之间进行异步数据交互的技术,它可以在不影响页面加载速度的情况下,实现与服务器的数据交互,并动态更新页面内容。通过AJAX,用户可以在不刷新整
AJAX 是一种用于在后台与服务器进行异步通信的技术。它能够实现在不刷新整个页面的情况下,通过后台发送请求并将响应返回到前端。然而,有时候在使用 AJAX 上传文件时会出现错误 7。本文将探讨这个错误的原因,并提
在现代网页开发中,Ajax 技术的应用日益广泛。其中,Ajax 下拉菜单 slide(下拉菜单的滑动效果)是一种常见且有趣的交互方式。通过使用 Ajax 技术实现下拉菜单 slide,可以为用户提供更好的用户体验,同时也能增加网
AJAX(Asynchronous JavaScript and XML)是一种常用的Web开发技术,它通过异步通信方式实现了与服务器的数据交互。在AJAX中,我们可以使用HTTP协议发送请求到服务器并获取响应。然而,有时候我们需要在请求中传递一
Python是一门非常流行的编程语言,近年来它的受欢迎度一直在不断地提高。在Python的使用者中还有一位特别的粉丝,他就是我们的歌手王力宏。
在前端开发中,使用Ajax来进行文件下载是一种常见的方法。通过Ajax可以实现在不刷新整个页面的前提下,向服务器发送请求并接收返回的文件数据。然而,当文件较大或者下载过程比较耗时时,我们可能需要提供一些提示或