簡體   English   中英

流與龍卷風和請求的遠程文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM