以下是我想在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(celery在另一台PC上),此视图启动芹菜任务,不断检查任务的状态,并在任务完成时获得结果。
我在这里关注time.sleep
的存在。 This SO POST表示使用time.sleep
是不合适的,因为它包含当前线程。使用django视图是否可能替换time.sleep
?或者是否允许time.sleep
用于此类用途?
我使用的是Django 1.8.6,Apache 2.4和mod_wsgi,Windows Server 2012 R2。提前谢谢。
答案 0 :(得分:1)
这是错误的做法。 Celery的重点是卸载长时间运行的任务,这样他们就不会延迟响应。
相反,你应该立即返回一个持有响应,然后通过Ajax获得你的前端 - 定期请求状态,可能来自另一个视图。
答案 1 :(得分:-1)
在答案和评论之后,谢天谢地,我留下了一些记录供以后使用。
正如丹尼尔的回答所说,芹菜的使用不是在服务器的某些计算过程中等待。因此,前端投掷和检查芹菜任务是很自然的。
并且javascript中的url暴露不是安全问题。根据{{3}}和This SO post,我可以将api url视为单个网页的网址,这是公知的,并且许多请求不会给服务器带来负担。
在我分别用于主Web服务和计算的两个服务器分开的情况下,应该配置CORS头。 that指出,当您为与主机不同的域调用ajax时,jQuery不会设置适当的标头,以致request.is_ajax()
不起作用。 ajax代码中的crossDomain: false
将解决此问题。
我仍在搜索并查明服务器端的安全性......正如keni所说,This SO post可能有所帮助。
我想我的问题并没有很好地总结我的担忧,所以我想在这里做。欢迎任何提示。