Hi Gavin,
The whole point of the HttpStreamingResponse API to access the content is to be
incompatible with HttpResponse. Otherwise it's too easy to consume streamed
content accidentally.
Re-introducing a common API ("streaming_content") would remove that benefit, it
would be confusing in the non-streamed case, and it would certainly be misused
("yes I just used ''.join(streamed_content), isn't that the canonical way to
access response content in all cases?").
The incompatible API is a hint that you must think about what you're doing when
you're writing streaming-aware middleware, and specifically, that you mustn't
consume the iterator.
Your goal is interesting but it seems optimistic to me. Out of the four
examples you gave, two are very hard to implement correctly for streaming
responses.
> - GzipMiddleware (compress_string(x) == compress_sequence([x]))
This one is implemented by Django. If you look at the code, you'll see it's
reasonable to use a different implementation for the streamed and not-streamed
cases.
> - StripWhitespaceMiddleware
For this one, the pattern would be:
if response.streaming:
response.streaming_content = itertools.imap(strip_whitespace,
response.streaming_content)
else:
response.content = strip_whitespace(response.content)
Yes, this is a bit of boilerplate. I'd like to reduce it, but not at the cost
of giving a streaming_content attribute to regular responses; it's too
confusing. You can probably abstract the pattern in a response middleware base
class. That works only when the "transform" function can be applied to any
subset of the content. I don't expect many useful middleware to fall in this
category
> - ContentDoctorMiddleware (https://github.com/unomena/django-content-doctor)
This won't work on streaming responses without consuming the content, because a
match for the regex may overlap a boundary between response chunks.
> - A hypothetical middleware that appends debug information to the end
> of the response. debug-toolbar may be able to work like this.
Looking for the </body> boils down to the same problem as above, and can't be
implemented without consuming the content for the same reason.
--
Aymeric.
--
You received this message because you are subscribed to the Google Groups
"Django developers" 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-developers?hl=en.