您可以使用任务队列和数据存储。您需要 3 个处理程序:
- 任务处理者,做艰苦的工作。它将其进度存储在数据存储中。
- 在后台启动任务并返回“空白”页面的处理程序
- 获取状态的处理程序
注意:页面不能真的是空白的。它必须有用于检查状态的javascript。我认为这也是正确的Channel API
。
无论如何继承Python中的代码:
class LongTaskStatus(ndb.Model):
is_complete = ndb.BooleanProperty()
percentage = ndb.FloatProperty()
messages = ndb.StringProperty(repeated=True)
class LongTaskHandler(webapp2.RequestHandler):
def get(self):
# Query for existing status model or create a new one
# Does work ...
# Update progress
status = LongTaskStatus()
status.messages.appen('Still busy...')
status.put()
# Does work ...
class StartHandler(webapp2.RequestHandler):
def get(self):
# start the task
taskqueue.add(url='/longtask')
# Return a page which uses javascript to check the progress every few seconds
template = JINJA_ENVIRONMENT.get_template('taskprogress.html')
self.response.write(template.render(template_values))
class CheckTaskStatus(wenapp2.RequestHandler):
def get(self):
query = LongTaskStatus.query().fetch(1)
result = {}
if query:
status = query[0]
result = {
'is_complete': status.is_complete,
'percentage': status.percentage,
'messages': status.messages
}
self.response.write(json.dumps(result))
这是“空白”页面:
<!DOCTYPE html>
<html lang="en">
<body>
<div id="status"></div>
<script>
window.setInterval(function(){
$.get( "ajax/test.html", function( data ) {
$( ".status" ).html( data );
});
}, 5000);
</script>
</body>
</html>
编辑:没有任务队列的其他选项
如果您有一种在任务启动之前识别任务的独特方法,则可以通过不使用任务队列 API 来加速此方法。
就是这样:
- 通过 javascript 调用 LongTaskHandler
- 重定向到调用 CheckTaskStatus 的加载页面。
这应该比使用任务队列更快,但不幸的是,您需要一种在任务启动之前识别任务的方法。例如用户ID、会话等