I am trying to download large file from python requests library by setting the stream=True
But i want this function to be executed asynchronously and send response back to server with downloading in the background.
Here is my code
async def downloadFile(url, filename):
r = requests.get(url, stream=True)
with open(os.path.join('./files', filename), 'wb+') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
# Creating same file name
# with _done appended to know that file has been downloaded
with open(os.path.join('./files', filename + '_done'), 'w+') as f:
f.close()
await asyncio.sleep(1)
Calling this function from other function like this
# check if file exist in server
if(os.path.exists(os.path.join('./files', fileName))):
#file exist!!!
#check if done file exist
if(os.path.exists(os.path.join('./files', fileName + '_done'))):
#done file exist
self.redirect(self.request.protocol + "://" +
self.request.host + '/files/' + fileName)
else:
#done file not exist. Wait for 5 min more
self.write('Wait 5 min')
self.finish()
else:
# file doesnt exist. Initiate download
self.write('Wait 5 min')
self.finish()
d = asyncio.ensure_future(downloadFile(
fileRes, fileName))
# loop = asyncio.get_event_loop()
# loop.run_until_complete(d)
The problem is that the file is created but its size remains 0 and the file appended "_done" is never created. What am I doing wrong here?