> 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