Thanks Ned, I had misunderstood the concept of "file-like" and you've
explained it admirably, exactly what I needed to know. Though
Malcolm's tip regarding the unsuitability of HttpResponse as a
flotation device will be a life-saver for many, I'm sure.

This is what works for me:

import cStringIO, zipfile

response = HttpResponse(mimetype='application/zip')
response['Content-Disposition'] = 'attachment; filename=zipfile.zip'
fobj = cStringIO.StringIO()
f = zipfile.ZipFile(fobj, "w")
f.write(filename)
f.close()
zip = fobj.getvalue()
fobj.close()
response.write(zip)
return response


On Feb 21, 12:34 pm, Ned Batchelder <[EMAIL PROTECTED]> wrote:
> In Python, there is a loose concept of a "file-like" object.  This means
> that the object behaves like a file under duck-typing, meaning it has
> the right methods to be treated just as if it were a file.  But the
> concept is only loosely defined, and different file-like objects
> implement different numbers of methods, according to their abilities.  
> HttpResponse does not implement seek(), and many consumers of file-like
> objects don't ever call seek(), so HttpResponses can be used as files in
> many cases.  ZipFile seems to be one case where it cannot, because
> ZipFile calls seek().
>
> Both the HttpRequest docs
> (http://www.djangoproject.com/documentation/request_response/) and the
> Python file docs (http://docs.python.org/lib/bltin-file-objects.html)
> mention "file-like" obliquely, with reference to methods that are or are
> not, or may or may not, be implemented.
>
> As Malcolm points out, seek() would require buffering, which you can
> provide by using an intermediary like StringIO.
>
> --Ned.http://nedbatchelder.com/blog
>
>
>
> Malcolm Tredinnick wrote:
> > On Thu, 2008-02-21 at 03:41 -0800, kip wrote:
>
> >> I thought I would be able to use an HttpResponse object as the file
> >> argument for ZipFile, like this:
>
> >> response = HttpResponse(mimetype='application/zip')
> >> response['Content-Disposition'] = 'attachment; filename=zipfile.zip'
> >> file = zipfile.ZipFile(response, "w")
>
> >> but as soon as I try to write to it I get the error "'HttpResponse'
> >> object has no attribute 'seek'".
>
> >> Am I missing something here?
>
> > No, you have all the information that's required to diagnose what you're
> > doing wrong. ZipFile apparently expects something with a seek() method
> > and HttpResponse doesn't have one (since it outputs content in a linear
> > fashion). You also cannot use HttpResponse as a lawn mower or  an a
> > floatation device as it's similarly not appropriate.
>
> > An HttpResponse is something that is designed to produce a string. That
> > string is sent back to the user. Since ZipFile wants something that acts
> > as a file, you need to turn the HttpResponse into something like that.
> > Try using StringIO.
>
> > Regards,
> > Malcolm
>
> --
> Ned Batchelder,http://nedbatchelder.com
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to