用time.sleep替代django视图中的while循环



下面是我想在django视图中执行的操作。

import requests, time
def SOME_VIEW_FOR_AJAX(request):
if request.is_ajax():
response = requests.get('API_URL_START_TASK')
# response is like {'ready':false, 'status':'PENDING'}
while not response['ready']:
response = requests.get('API_URL_CHECK_TASK')
time.sleep(1)
result = response.get()
# SOME MORE WORKS ...

该视图通过api(在另一台PC上)启动一个芹菜任务,不断检查任务的状态,并在任务完成后获得结果。

这里我关心time.sleep的存在。这个SOPOST错误告诉我们time.sleep的使用是不合适的,因为它包含一个当前线程。是否有可能替换time.sleep来使用django视图?还是允许使用time.sleep进行这种用途?

我使用的是Django 1.8.6,Apache 2.4和mod_wsgi,Windows Server 2012 R2。提前谢谢。

这是错误的方法。Celery的全部目的是卸载长时间运行的任务,这样它们就不会延迟响应。

相反,您应该立即返回一个等待响应,然后让前端(可能通过Ajax)定期请求状态,可能是从另一个视图请求。

在回答和评论之后,谢天谢地,我留下了一个记录供以后使用。

正如Daniel的回答所说,芹菜的使用不是在服务器进行某些计算时等待。因此,前端抛出并检查芹菜任务是很自然的。

javascript中url的暴露并不是安全问题。根据This SO post and that,我可以将api url视为单个网页的url,这是众所周知的,许多请求不会给服务器带来负担。

在我的情况下,分别用于主web服务和计算的两个服务器是分开的,应该配置CORS头。这篇SO文章指出,当您为不同于主机的域调用ajax时,jQuery不会设置适当的头,因此request.is_ajax()无法工作。ajax代码中的crossDomain: false将解决这个问题。

我仍在搜索并弄清楚服务器端的安全性。。。正如凯尼所说,这可能会有所帮助。

我想我的问题并没有很好地概括我的担忧,所以我想在这里做。欢迎任何小费。

相关内容

  • 没有找到相关文章

最新更新