diff --git a/docs/sanic/streaming.md b/docs/sanic/streaming.md index 53eebad7..769d269d 100644 --- a/docs/sanic/streaming.md +++ b/docs/sanic/streaming.md @@ -42,7 +42,7 @@ async def handler(request): @bp.put('/bp_stream', stream=True) -async def bp_handler(request): +async def bp_put_handler(request): result = '' while True: body = await request.stream.read() @@ -52,6 +52,19 @@ async def bp_handler(request): return text(result) +# You can also use `bp.add_route()` with stream argument +async def bp_post_handler(request): + result = '' + while True: + body = await request.stream.read() + if body is None: + break + result += body.decode('utf-8').replace('1', 'A') + return text(result) + +bp.add_route(bp_post_handler, '/bp_stream', methods=['POST'], stream=True) + + async def post_handler(request): result = '' while True: diff --git a/sanic/blueprints.py b/sanic/blueprints.py index 5945c3ae..f2575e57 100644 --- a/sanic/blueprints.py +++ b/sanic/blueprints.py @@ -212,6 +212,7 @@ class Blueprint: strict_slashes=None, version=None, name=None, + stream=False, ): """Create a blueprint route from a function. @@ -224,6 +225,7 @@ class Blueprint: training */* :param version: Blueprint Version :param name: user defined route name for url_for + :param stream: boolean specifying if the handler is a stream handler :return: function or class instance """ # Handle HTTPMethodView differently @@ -246,6 +248,7 @@ class Blueprint: methods=methods, host=host, strict_slashes=strict_slashes, + stream=stream, version=version, name=name, )(handler) diff --git a/sanic/response.py b/sanic/response.py index 7b245a82..43e24877 100644 --- a/sanic/response.py +++ b/sanic/response.py @@ -117,7 +117,7 @@ class StreamingHTTPResponse(BaseHTTPResponse): headers = self._parse_headers() - if self.status is 200: + if self.status == 200: status = b"OK" else: status = STATUS_CODES.get(self.status) @@ -176,7 +176,7 @@ class HTTPResponse(BaseHTTPResponse): headers = self._parse_headers() - if self.status is 200: + if self.status == 200: status = b"OK" else: status = STATUS_CODES.get(self.status, b"UNKNOWN RESPONSE") diff --git a/tests/test_request_stream.py b/tests/test_request_stream.py index bf8bf7d4..42f2852c 100644 --- a/tests/test_request_stream.py +++ b/tests/test_request_stream.py @@ -270,6 +270,18 @@ def test_request_stream_blueprint(app): return stream(streaming) + async def post_add_route(request): + assert isinstance(request.stream, StreamBuffer) + + async def streaming(response): + while True: + body = await request.stream.read() + if body is None: + break + await response.write(body.decode("utf-8")) + return stream(streaming) + + bp.add_route(post_add_route, '/post/add_route', methods=['POST'], stream=True) app.blueprint(bp) assert app.is_request_stream is True @@ -314,6 +326,10 @@ def test_request_stream_blueprint(app): assert response.status == 200 assert response.text == data + request, response = app.test_client.post("/post/add_route", data=data) + assert response.status == 200 + assert response.text == data + def test_request_stream_composition_view(app): """for self.is_request_stream = True"""