Javascript 芹菜+;Django+;jQuery——在jQuery中报告芹菜任务的成功/失败
我问了一个类似的问题,关于如何检测和报告芹菜任务何时完成(或失败)。这个问题集中在如何使用Django消息框架来实现这一点,这对于我来说是不必要的。我目前的方法是只发送一个JSON HttpResponse,并根据接收到的JSON呈现成功或失败消息。下面是我用来轮询任务状态的代码: views.py:Javascript 芹菜+;Django+;jQuery——在jQuery中报告芹菜任务的成功/失败,javascript,jquery,python,django,celery,Javascript,Jquery,Python,Django,Celery,我问了一个类似的问题,关于如何检测和报告芹菜任务何时完成(或失败)。这个问题集中在如何使用Django消息框架来实现这一点,这对于我来说是不必要的。我目前的方法是只发送一个JSON HttpResponse,并根据接收到的JSON呈现成功或失败消息。下面是我用来轮询任务状态的代码: views.py: def poll_state(request): if request.is_ajax(): if 'task_id' in request.POST.keys() and
def poll_state(request):
if request.is_ajax():
if 'task_id' in request.POST.keys() and request.POST['task_id']:
task_id = request.POST['task_id']
task = AsyncResult(task_id)
if task.successful():
logger.debug("Successful upload")
return HttpResponse(json.dumps({"message":"Upload successful!", "state":"SUCCESS"}), content_type='application/json')
elif task.failed():
logger.debug("Error in upload")
return HttpResponse(json.dumps({"message":"Error in upload!", "state":"FAILURE"}), content_type='application/json')
else:
logger.info('No task_id in the request')
else:
logger.info('Not an ajax request')
result = task.result
state = task.state
response = {}
response["percent"] = result["percent"]
response["state"] = state
json_data = json.dumps(response)
return HttpResponse(json_data, content_type='application/json')
以及相应的jQuery(和Django模板):
下面是任务本身的代码:
tasks.py:
@task(base=DBTask) # a custom base task class
def upload_task(datapoints, user, description): # datapoints is a list of dictionaries, user and description are strings
from utils.db.databaseinserter import insertIntoDatabase
for dp_count in insertIntoDatabase(datapoints, user, description): # insertIntoDatabase yields the number of datapoints inserted into the database so far at the end of each iteration
percent_completion = int(100 * (float(dp_count) / float(len(datapoints))))
current_task.update_state(state='PROGRESS', meta={'percent':percent_completion})
如果上传成功,那么一旦上传完成,控制台日志就会被JSON成功消息弄得乱七八糟。如果上传有错误,那么重新加载会在日志中显示错误消息。在这两种情况下,poll_state
持续发送HttpResponse of success或failure。此外,在启动新任务后,我仍将发送旧任务信息,而不是当前任务信息。唯一接收到当前任务信息的时间是服务器首次启动时的第一个任务;后续任务的任何轮询将只获取第一个任务的信息
我做错了什么?我对这件事挠头已经有一段时间了,但还是想不出来。这里的最终目标是在web页面上显示某种任务完成或任务失败的通知,并且在完成后不会重复发送成功/失败HttpResponse
我已尝试删除
task.successful()
和task.failed()中的task\u id会话键poll\u状态中的块。这确实防止了重复发送成功/失败的HttpResponse,但我仍然存在后续任务没有发送其HttpResponse的问题;发生的情况是,一旦在第一个任务之后启动了一个新任务,就会发送第一个任务的HttpResponse,并且当前任务的百分比跟踪不再工作 经过艰苦的努力和奋斗,事实证明,我所有问题的答案都是一句话
这个特殊问题的解决办法是改变
task_id = request.POST['task_id']
到
在轮询状态下
您可以添加服务器端的异常吗?这可能有助于我们找出它失败的地方。事实上,我已经对这个问题做了很多修改,以反映现在发生的事情。我之前遇到的一个例外是在poll_state
中在Django端误用了json.dumps
,这无疑是愚蠢的。不幸的是,这个错误并不像我希望的那样是问题的核心,我目前的民意调查仍然存在问题。嘿,丹,你有没有调查过这个问题:?我查看了这个链接,思考了一段时间后,我仍然不确定如何利用它来解决这个问题。你有什么特别的想法吗?谢谢
task_id = request.POST['task_id']
task_id = request.session['task_id']