python - How to use pyramid.response.FileIter -


i have following view code attempts "stream" zipfile client download:

import os import zipfile import tempfile pyramid.response import fileiter  def zipper(request):     _temp_path = request.registry.settings['_temp']     tmpfile = tempfile.namedtemporaryfile('w', dir=_temp_path, delete=true)      tmpfile_path = tmpfile.name      ## creating zipfile , adding files     z = zipfile.zipfile(tmpfile_path, "w")     z.write('somefile1.txt')     z.write('somefile2.txt')     z.close()      ## renaming zipfile     new_zip_path = _temp_path + '/somefilegroup.zip'     os.rename(tmpfile_path, new_zip_path)      ## re-opening zipfile new name     z = zipfile.zipfile(new_zip_path, 'r')     response = fileiter(z.fp)      return response 

however, response in browser:

could not convert return value of view callable function newsite.static.zipper response object. value returned .

i suppose not using fileiter correctly.


update:

since updating michael merickel's suggestions, fileiter function working correctly. however, still lingering mime type error appears on client (browser): resource interpreted document transferred mime type application/zip: "http://newsite.local:6543/zipper?data=%7b%22ids%22%3a%5b6%2c7%5d%7d"

to better illustrate issue, have included tiny .py , .pt file on github: https://github.com/thapar/zipper-fix

fileiter not response object, error message says. iterable can used response body, that's it. zipfile can accept file object, more useful here file path. let's try writing tmpfile, rewinding file pointer start, , using write out without doing fancy renaming.

import os import zipfile import tempfile pyramid.response import fileiter  def zipper(request):     _temp_path = request.registry.settings['_temp']     fp = tempfile.namedtemporaryfile('w+b', dir=_temp_path, delete=true)      ## creating zipfile , adding files     z = zipfile.zipfile(fp, "w")     z.write('somefile1.txt')     z.write('somefile2.txt')     z.close()      # rewind fp start of file     fp.seek(0)      response = request.response     response.content_type = 'application/zip'     response.app_iter = fileiter(fp)     return response 

i changed mode on namedtemporaryfile 'w+b' per docs allow file written and read from.


Comments

Popular posts from this blog

monitor web browser programmatically in Android? -

Shrink a YouTube video to responsive width -

wpf - PdfWriter.GetInstance throws System.NullReferenceException -