下面是我想在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
将解决这个问题。
我仍在搜索并弄清楚服务器端的安全性。。。正如凯尼所说,这可能会有所帮助。
我想我的问题并没有很好地概括我的担忧,所以我想在这里做。欢迎任何小费。