Python sanic.response.stream() Examples
The following are 16
code examples of sanic.response.stream().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
sanic.response
, or try the search function
.
Example #1
Source File: test_request_stream.py From sanic with MIT License | 6 votes |
def test_request_stream_handle_exception(app): """for handling exceptions properly""" @app.post("/post/<id>", stream=True) async def post(request, id): assert isinstance(request.stream, StreamBuffer) result = "" while True: body = await request.stream.read() if body is None: break result += body.decode("utf-8") return text(result) # 404 request, response = app.test_client.post("/in_valid_post", data=data) assert response.status == 404 assert "Requested URL /in_valid_post not found" in response.text # 405 request, response = app.test_client.get("/post/random_id") assert response.status == 405 assert "Method GET not allowed for URL /post/random_id" in response.text
Example #2
Source File: channel.py From rasa-for-botfront with Apache License 2.0 | 6 votes |
def stream_response( self, on_new_message: Callable[[UserMessage], Awaitable[None]], text: Text, sender_id: Text, input_channel: Text, metadata: Optional[Dict[Text, Any]], ) -> Callable[[Any], Awaitable[None]]: async def stream(resp: Any) -> None: q = Queue() task = asyncio.ensure_future( self.on_message_wrapper( on_new_message, text, q, sender_id, input_channel, metadata ) ) result = None # declare variable up front to avoid pytype error while True: result = await q.get() if result == "DONE": break else: await resp.write(json.dumps(result) + "\n") await task return stream # pytype: disable=bad-return-type
Example #3
Source File: run_asgi.py From sanic with MIT License | 5 votes |
def handler_stream(request): while True: body = await request.stream.read() if body is None: break body = body.decode("utf-8").replace("1", "A") # await response.write(body) return response.stream(body)
Example #4
Source File: server.py From sanic with MIT License | 5 votes |
def post(self, request): result = '' while True: body = await request.stream.get() if body is None: break result += body.decode('utf-8') return text(result)
Example #5
Source File: server.py From sanic with MIT License | 5 votes |
def handler(request): async def streaming(response): while True: body = await request.stream.get() if body is None: break body = body.decode('utf-8').replace('1', 'A') await response.write(body) return stream(streaming)
Example #6
Source File: server.py From sanic with MIT License | 5 votes |
def bp_handler(request): result = '' while True: body = await request.stream.get() if body is None: break result += body.decode('utf-8').replace('1', 'A') return text(result)
Example #7
Source File: server.py From sanic with MIT License | 5 votes |
def post_handler(request): result = '' while True: body = await request.stream.get() if body is None: break result += body.decode('utf-8') return text(result)
Example #8
Source File: test_request_stream.py From sanic with MIT License | 5 votes |
def test_request_stream_100_continue(app, headers, expect_raise_exception): class SimpleView(HTTPMethodView): @stream_decorator async def post(self, request): assert isinstance(request.stream, StreamBuffer) result = "" while True: body = await request.stream.read() if body is None: break result += body.decode("utf-8") return text(result) app.add_route(SimpleView.as_view(), "/method_view") assert app.is_request_stream is True if not expect_raise_exception: request, response = app.test_client.post( "/method_view", data=data, headers={"EXPECT": "100-continue"} ) assert response.status == 200 assert response.text == data else: with pytest.raises(ValueError) as e: app.test_client.post( "/method_view", data=data, headers={"EXPECT": "100-continue-extra"}, ) assert "Unknown Expect: 100-continue-extra" in str(e)
Example #9
Source File: test_request_stream.py From sanic with MIT License | 5 votes |
def test_request_stream_composition_view(app): """for self.is_request_stream = True""" def get_handler(request): assert request.stream is None return text("OK") async def post_handler(request): assert isinstance(request.stream, StreamBuffer) result = "" while True: body = await request.stream.read() if body is None: break result += body.decode("utf-8") return text(result) view = CompositionView() view.add(["GET"], get_handler) view.add(["POST"], post_handler, stream=True) app.add_route(view, "/composition_view") assert app.is_request_stream is True request, response = app.test_client.get("/composition_view") assert response.status == 200 assert response.text == "OK" request, response = app.test_client.post("/composition_view", data=data) assert response.status == 200 assert response.text == data
Example #10
Source File: test_request_stream.py From sanic with MIT License | 5 votes |
def test_streaming_new_api(app): @app.post("/non-stream") async def handler(request): assert request.body == b"x" await request.receive_body() # This should do nothing assert request.body == b"x" return text("OK") @app.post("/1", stream=True) async def handler(request): assert request.stream assert not request.body await request.receive_body() return text(request.body.decode().upper()) @app.post("/2", stream=True) async def handler(request): ret = [] async for data in request.stream: # We should have no b"" or None, just proper chunks assert data assert isinstance(data, bytes) ret.append(data.decode("ASCII")) return json(ret) request, response = app.test_client.post("/non-stream", data="x") assert response.status == 200 request, response = app.test_client.post("/1", data="TEST data") assert request.body == b"TEST data" assert response.status == 200 assert response.text == "TEST DATA" request, response = app.test_client.post("/2", data=data) assert response.status == 200 res = response.json assert isinstance(res, list) assert len(res) > 1 assert "".join(res) == data
Example #11
Source File: test_request_cancel.py From sanic with MIT License | 5 votes |
def test_stream_request_cancel_when_conn_lost(app): app.still_serving_cancelled_request = False @app.post("/post/<id>", stream=True) async def post(request, id): assert isinstance(request.stream, asyncio.Queue) async def streaming(response): while True: body = await request.stream.get() if body is None: break await response.write(body.decode("utf-8")) await asyncio.sleep(1.0) # at this point client is already disconnected app.still_serving_cancelled_request = True return stream(streaming) # schedule client call loop = asyncio.get_event_loop() task = loop.create_task(app.asgi_client.post("/post/1")) loop.call_later(0.01, task) await asyncio.sleep(0.5) # cancelling request and closing connection after 0.5 sec task.cancel() with contextlib.suppress(asyncio.CancelledError): await task # Wait for server and check if it's still serving the cancelled request await asyncio.sleep(1.0) assert app.still_serving_cancelled_request is False
Example #12
Source File: channel.py From rasa_core with Apache License 2.0 | 5 votes |
def stream_response(self, on_new_message, text, sender_id): async def stream(resp): q = Queue() task = asyncio.ensure_future( self.on_message_wrapper(on_new_message, text, q, sender_id)) while True: result = await q.get() if result == "DONE": break else: await resp.write(json.dumps(result) + "\n") await task return stream
Example #13
Source File: channel.py From rasa_core with Apache License 2.0 | 5 votes |
def blueprint(self, on_new_message): custom_webhook = Blueprint( 'custom_webhook_{}'.format(type(self).__name__), inspect.getmodule(self).__name__) # noinspection PyUnusedLocal @custom_webhook.route("/", methods=['GET']) async def health(request): return response.json({"status": "ok"}) @custom_webhook.route("/webhook", methods=['POST']) async def receive(request): sender_id = await self._extract_sender(request) text = self._extract_message(request) should_use_stream = utils.bool_arg(request, "stream", default=False) if should_use_stream: return response.stream( self.stream_response(on_new_message, text, sender_id), content_type='text/event-stream') else: collector = CollectingOutputChannel() # noinspection PyBroadException try: await on_new_message(UserMessage(text, collector, sender_id, input_channel=self.name())) except CancelledError: logger.error("Message handling timed out for " "user message '{}'.".format(text)) except Exception: logger.exception("An exception occured while handling " "user message '{}'.".format(text)) return response.json(collector.messages) return custom_webhook
Example #14
Source File: sanic_server.py From aredis with MIT License | 5 votes |
def notification(request): async def _stream(res): redis = aredis.StrictRedis() pub = redis.pubsub() await pub.subscribe('test') end_time = app.loop.time() + 30 while app.loop.time() < end_time: await redis.publish('test', 111) message = None while not message: message = await pub.get_message() res.write(message) await asyncio.sleep(0.1) return stream(_stream)
Example #15
Source File: channel.py From rasa-for-botfront with Apache License 2.0 | 4 votes |
def blueprint( self, on_new_message: Callable[[UserMessage], Awaitable[None]] ) -> Blueprint: custom_webhook = Blueprint( "custom_webhook_{}".format(type(self).__name__), inspect.getmodule(self).__name__, ) # noinspection PyUnusedLocal @custom_webhook.route("/", methods=["GET"]) async def health(request: Request) -> HTTPResponse: return response.json({"status": "ok"}) @custom_webhook.route("/webhook", methods=["POST"]) async def receive(request: Request) -> HTTPResponse: sender_id = await self._extract_sender(request) text = self._extract_message(request) should_use_stream = rasa.utils.endpoints.bool_arg( request, "stream", default=False ) input_channel = self._extract_input_channel(request) metadata = self.get_metadata(request) if should_use_stream: return response.stream( self.stream_response( on_new_message, text, sender_id, input_channel, metadata ), content_type="text/event-stream", ) else: collector = CollectingOutputChannel() # noinspection PyBroadException try: await on_new_message( UserMessage( text, collector, sender_id, input_channel=input_channel, metadata=metadata, ) ) except CancelledError: logger.error( "Message handling timed out for " "user message '{}'.".format(text) ) except Exception: logger.exception( "An exception occured while handling " "user message '{}'.".format(text) ) return response.json(collector.messages) return custom_webhook
Example #16
Source File: http.py From synse-server with GNU General Public License v3.0 | 4 votes |
def read_cache(request: Request) -> StreamingHTTPResponse: """Stream cached reading data from the registered plugins. Plugins may optionally cache readings for a given time window. This endpoint exposes the data in that cache. If a readings cache is not configured for a plugin, a snapshot of its current reading state is streamed back in the response. Args: request: The Sanic request object. Query Parameters: start: An RFC3339 formatted timestamp which specifies a starting bound on the cache data to return. If left unspecified, there will be no starting bound. end: An RFC3339 formatted timestamp which specifies an ending bound on the cache data to return. If left unspecified, there will be no ending bound. Returns: A JSON-formatted HTTP response with the possible statuses: * 200: OK * 400: Invalid query parameter(s) * 500: Catchall processing error """ start = '' param_start = request.args.getlist('start') if param_start: if len(param_start) > 1: raise errors.InvalidUsage( 'invalid parameter: only one cache start may be specified', ) start = param_start[0] end = '' param_end = request.args.getlist('end') if param_end: if len(param_end) > 1: raise errors.InvalidUsage( 'invalid parameter: only one cache end may be specified', ) end = param_end[0] # Define the function that will be used to stream the responses back. async def response_streamer(response): # Due to how streamed responses are handled, an exception here won't # end up surfacing to the user through Synse's custom error handler # and instead appear to create an opaque error relating to an invalid # character in the chunk header. Instead of surfacing that error, we # just log it and move on. try: async for reading in cmd.read_cache(start, end): await response.write(ujson.dumps(reading) + '\n') except Exception: logger.exception('failure when streaming cached readings') return stream(response_streamer, content_type='application/json; charset=utf-8')