{{{
buffer = io.BytesIO()
buffer.write(b'some binary content')
return FileResponse(buffer, filename='somename.bin')
}}}
and the response is empty because the stream position is at the end of the
buffer. I can easily fix that by seeking the buffer myself, but shouldn't
`FileResponse` seek itself in `_set_streaming_content` before calling
`filelike.read`?
--
Ticket URL: <https://code.djangoproject.com/ticket/30694>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* status: new => closed
* resolution: => wontfix
Comment:
Hi Claude.
> ...shouldn't FileResponse seek itself ...
I think not here.
I imagine a situation where you want to tail a log, say. You can't do that
if we reset the stream position ourselves.
I then think that resetting the stream makes `FileResponse` a little bit
too clever. (Happy if someone wants to put that in a subclass, but it's
beyond "take a buffer, stream it to an HTTP response", which is what I
take to be the limit of the scope here.)
So, for me, the maxim in play is, "You pass an open file. Your
responsibility to `seek` accordingly".
As such, I'm going to go with `wontfix`. I hope that makes sense.
**Maybe** an addition to the FileResponse docs?
> ...`streaming_content` begins from the current cursor position of
`open_file`...
(Or such, somewhere.)
--
Ticket URL: <https://code.djangoproject.com/ticket/30694#comment:1>
* component: HTTP handling => Documentation
Comment:
Something like that?:
{{{
diff --git a/docs/ref/request-response.txt b/docs/ref/request-response.txt
index 19593dfb90..3dfbf28cf6 100644
--- a/docs/ref/request-response.txt
+++ b/docs/ref/request-response.txt
@@ -1122,6 +1122,8 @@ Attributes
If ``open_file`` doesn't have a name or if the name of ``open_file``
isn't
appropriate, provide a custom file name using the ``filename``
parameter.
+ Note that if you pass a file-like object like ``io.BytesIO``, it's
your
+ task to ``seek()`` it before passing it to ``FileResponse``.
The ``Content-Length`` and ``Content-Type`` headers are automatically
set
when they can be guessed from contents of ``open_file``.
}}}
I suspect the example in https://docs.djangoproject.com/en/2.2/howto
/outputting-pdf/#write-your-view is missing the seek call.
--
Ticket URL: <https://code.djangoproject.com/ticket/30694#comment:2>
* status: closed => new
* resolution: wontfix =>
* stage: Unreviewed => Accepted
Comment:
Yep, I'll take that. Perfect. 🙂
--
Ticket URL: <https://code.djangoproject.com/ticket/30694#comment:3>
* has_patch: 0 => 1
Comment:
[https://github.com/django/django/pull/11676 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/30694#comment:4>
* status: new => closed
* resolution: => fixed
Comment:
In [changeset:"7203efb799969b4662ecb58f4cefd2a5f2e0062b" 7203efb7]:
{{{
#!CommitTicketReference repository=""
revision="7203efb799969b4662ecb58f4cefd2a5f2e0062b"
Fixed #30694 -- Documented FileResponse does not seek its file source.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30694#comment:5>
Comment (by Carlton Gibson <carlton.gibson@…>):
In [changeset:"556cef1ba8facbd3231f6351956a6581c6367632" 556cef1]:
{{{
#!CommitTicketReference repository=""
revision="556cef1ba8facbd3231f6351956a6581c6367632"
[2.2.x] Fixed #30694 -- Documented FileResponse does not seek its file
source.
Backport of 7203efb799969b4662ecb58f4cefd2a5f2e0062b from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30694#comment:6>