> I generally like it.
> 
> About the *.file_wrapper removal, i suggest
> a PSGI-like approach where 'body' can contains a File Object.
> 
> def file_app(environ):
>    fd = open('/tmp/pippo.txt', 'r')
>    status = b'200 OK'
>    headers = [(b'Content-type', b'text/plain')]
>    body = fd
>    return body, status, headers
> 
As far as I understand it, `body` is an iterable so there should not be any 
problem with sending a file through directly in this manner. Better, the web3 
spec specifically mandates that if the `body` iterable has a `close` method it 
must be called on request completion (second-to-last paragraph in the 
specification details section [0]). So a File Object as a body is already 
completely handled by web3.

On the other hand, `body` has to yield bytes, so `fd = open('/tmp/pippo.txt', 
'rb')` I think.

> def file_app(environ):
>    fd = open('/tmp/pippo.txt', 'r')
>    status = b'200 OK'
>    headers = [(b'Content-type', b'text/plain')]
>    body = [b'Header', fd, b'Footer']
>    return body, status, headers
> 
> 
> (and what about returning multiple File objects ?)
> 
Well you could just use `itertools.chain([b'Header'], fd, [b'Footer'])` and 
`itertools.chain(*files)` respectively though there is the issue that, with 
non-refcounting GCs (Jython, IronPython, pypy), these may stay unclosed for 
quite some time. A good idea would probably be some kind of `closingchain` 
replacement to `itertools.chain` which would be able to `close()` its 
sub-iterables if they're closable (or maybe a `contextchain` which calls 
`__enter__` and `__exit__` on its sub-iterables if those are available).

[0] http://python.org/dev/peps/pep-0444/#specification-details
_______________________________________________
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com

Reply via email to