[英]Stream a remote file with tornado and requests
所以基本上我想做的是打開與遠程文件的連接,並大塊讀取它,然后將其拼寫為用戶
使用龍卷風作為Web框架並請求讀取遠程文件
這是我到目前為止的去處
class DefaultHandler(tornado.web.RequestHandler):
def get(self):
url = 'http://domain.tld/large_file.rar'
r = requests.get(url, stream=True)
self.set_header('Content-Type', 'application/force-download')
self.set_header('Content-Disposition', 'attachment; filename=large_file.rar')
self.set_header('Content-length', r.headers.get('content-length'))
self.set_header('Pragma', 'public')
self.set_header('Expires', 0)
self.set_header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
self.set_header('Cache-Controle', 'public')
self.set_header('Content-Transfer-Encoding', 'binary')
self.set_header('Accept-Ranges', 'bytes')
self.set_header('Connection', 'close')
for chunk in r.iter_content(chunk_size=1024):
if chunk:
self.write(chunk)
self.flush()
self.finish()
編輯 - - - - - - - - - - - - - - - - - - - - -
class DefaultHandler(tornado.web.RequestHandler):
def get(self):
url = 'http://largefilelocation'
r = requests.Request('GET', url).prepare()
resp = requests.Session().send(r, stream=True)
self.set_header('Content-Type', 'application/force-download')
self.set_header('Content-Disposition', resp.headers['content-disposition'])
self.set_header('Pragma', 'public')
self.set_header('Expires', 0)
self.set_header('Content-Length', int(resp.headers['content-length']))
self.set_header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
self.set_header('Cache-Controle', 'public')
self.set_header('Content-Transfer-Encoding', 'binary')
self.set_header('Accept-Ranges', 'bytes')
self.set_header('Connection', 'close')
for chunk in self._file_stream(resp):
self.write(chunk)
self.flush()
self.finish()
def _file_stream(self, resp):
print resp.headers
for chunk in resp.iter_lines(128):
if not chunk: break
yield chunk
requests
庫是同步的,這意味着它在您使用IOLoop
時會阻塞。 您必須使用Tornado的AsyncHTTPClient
來允許IOLoop
繼續運行。 AsyncHTTPClient
有一個streaming_callback
選項,您可以在這里使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.