gpt4 book ai didi

javascript - 从 AJAX 请求调用 django View (解析 celery task_id)

转载 作者:数据小太阳 更新时间:2023-10-29 04:48:50 25 4
gpt4 key购买 nike

我正在尝试将 celery 任务中的数据输出到单独的窗口中。我是 JavaScriptAJAX 的新手,这就是我当前的问题所在。执行 View 后,将启动 celery 任务并呈现下一个 html 页面(success.html):

成功.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

和 View :

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 中仍有许多 Unresolved 问题我不完全理解,通过反复试验我会到达那里,但现在,task_state 是没有被调用。我怀疑问题出在 AJAX 调用(“url”)上,但我不知道为什么。我哪里错了?

更新:选中“JS Test Stuff”复选框后,success.html 被渲染,没有错误。 AJAX JavaScript (task_output_retrieval.js) 是从 success.html 中调用的,这是经过验证的,因为从 success.html 我是调用 2 个 JavaScript 文件(另一个是 update-hello-user.js)。 task_output_retrieval.js 的窗口打开,update-hello-user.js 的弹出窗口也会显示。它在我调用 View 的 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('', 'new window', 'width=200, height=100');

$.ajax({
url: query_url,
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'); }
});
}

您在评论中说过 Django 没有看到请求。一个常见的问题是 CSRF 保护:自定义 POST 请求需要传递 CSRF token ,否则将被拒绝。如何执行此操作的细节部分取决于您的特定配置,但通常我会这样做:

// 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...
});

关于javascript - 从 AJAX 请求调用 django View (解析 celery task_id),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com