【问题标题】:Showing the progress of a tornado request显示龙卷风请求的进度
【发布时间】:2016-02-07 09:31:38
【问题描述】:
我有一个 tornado 应用程序,它上传大型文本文件(大约 500,000 行),然后对其进行一些处理,最后将数据插入 MySQL 表。
我这样做了,但我想显示该过程的进度。换句话说,由于这个过程需要很长时间,我想向用户显示处理了多少条文件记录以及向表中插入了多少条记录。
我认为也许可以制作一个 json 文件并将进度写入其中,然后使用 AJAX 读取内容并显示在页面中。
有没有更好的办法?
【问题讨论】:
标签:
mysql
ajax
file-upload
progress-bar
tornado
【解决方案1】:
终于,我得到了答案。
我使用WebSocket查看上传文件的进度。
也就是说,我首先使用处理程序上传文件,然后,当网页呈现到浏览器时,我打开一个套接字连接并使用线程启动进程。
类似这样的:
class MyProcessWebSocket(WebSocketHandler):
def __init__(self, application, request, **kwargs):
super(ProcessBillWebSocket, self).__init__(application, request, **kwargs)
self.fid = None
def do_process(self, z, name):
res = dict(percent=0)
self.write_message(res)
# do some process and self.write_message(res) in each loop.
self.close()
def open(self, *args, **kwargs):
try:
self.fid = args[0] if args[0] else None
except:
pass
if not self.fid:
self.close()
return
# Open file with self.fid that sent from rendered webpage.
filename = os.path.join(sh.web['static_address'], 'tmp', '%s.txt' % self.fid)
try:
z = ProcessClass.read_file(filename)
t = threading.Thread(target=self.do_process, args=(z, self.fid))
t.start()
finally:
os.remove(filename)
def on_message(self, message):
# nothing to do
pass
def on_close(self):
print("connection closed.")
我不知道这是不是好方法,但我的问题已经解决了。
还有别的想法吗???