From 357de7085ac279d6077209751c88cd184d01c4f7 Mon Sep 17 00:00:00 2001 From: Denis Makogon Date: Wed, 18 Oct 2017 15:32:57 +0300 Subject: [PATCH] Updating Python hot HTTP/JSON sample (#379) * Updating Python hot HTTP sample - using latest hotfn 0.0.5 release (made life lot easier) * Updating to latest 0.0.6 release What's new? - new request data signature: context, data, loop - supports event loop (very useful for request body handeler of coroutine type) * Updating example with respect to recent fdk-python release * Addressing review comments --- examples/formats/http/python/Dockerfile | 8 --- examples/formats/http/python/func.py | 53 ++++++------------- examples/formats/http/python/func.yaml | 2 +- examples/formats/http/python/requirements.txt | 4 +- examples/formats/json/python/func.py | 20 +++++++ examples/formats/json/python/func.yaml | 7 +++ examples/formats/json/python/requirements.txt | 1 + 7 files changed, 47 insertions(+), 48 deletions(-) delete mode 100644 examples/formats/http/python/Dockerfile create mode 100644 examples/formats/json/python/func.py create mode 100644 examples/formats/json/python/func.yaml create mode 100644 examples/formats/json/python/requirements.txt diff --git a/examples/formats/http/python/Dockerfile b/examples/formats/http/python/Dockerfile deleted file mode 100644 index 9819cadfa..000000000 --- a/examples/formats/http/python/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM python:3.6.2 - -RUN mkdir /code -ADD . /code/ -WORKDIR /code -RUN pip3 install -r requirements.txt - -ENTRYPOINT ["python3", "func.py"] diff --git a/examples/formats/http/python/func.py b/examples/formats/http/python/func.py index 5b3189e84..e09d91b20 100644 --- a/examples/formats/http/python/func.py +++ b/examples/formats/http/python/func.py @@ -1,42 +1,21 @@ -import asyncio -import sys -import uvloop - -from hotfn.http import request -from hotfn.http import response +import fdk -class MyProtocol(asyncio.Protocol): - - def connection_made(self, transport): - print('pipe opened', file=sys.stderr, flush=True) - super(MyProtocol, self).connection_made(transport=transport) - - def data_received(self, data): - print('received: {!r}'.format(data), file=sys.stderr, flush=True) - data = data.decode() - req = request.RawRequest(data) - (method, url, dict_params, - headers, http_version, req_data) = req.parse_raw_request() - - rs = response.RawResponse( - http_version, 200, "OK", - response_data=req_data) - print(rs.dump(), file=sys.stdout, flush=True) - super(MyProtocol, self).data_received(data) - - def connection_lost(self, exc): - print('pipe closed', file=sys.stderr, flush=True) - super(MyProtocol, self).connection_lost(exc) +@fdk.coerce_http_input_to_content_type +def app(context, data=None, loop=None): + """ + User's request body handler + :param context: request context + :type context: hotfn.http.request.RequestContext + :param data: request body, it's type depends on request Content-Type header + :type data: object + :param loop: asyncio event loop + :type loop asyncio.AbstractEventLoop + :return: echo of data + :rtype: object + """ + return data if __name__ == "__main__": - with open("/dev/stdin", "rb", buffering=0) as stdin: - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) - loop = asyncio.get_event_loop() - try: - stdin_pipe_reader = loop.connect_read_pipe(MyProtocol, stdin) - loop.run_until_complete(stdin_pipe_reader) - loop.run_forever() - finally: - loop.close() + fdk.handle(app) diff --git a/examples/formats/http/python/func.yaml b/examples/formats/http/python/func.yaml index 46e8b8631..c64347ead 100644 --- a/examples/formats/http/python/func.yaml +++ b/examples/formats/http/python/func.yaml @@ -1,6 +1,6 @@ name: fnproject/hot-http-python version: 0.0.1 -runtime: docker +runtime: python3.6.2 type: sync memory: 521 format: http diff --git a/examples/formats/http/python/requirements.txt b/examples/formats/http/python/requirements.txt index c4fd6ca78..a986207ee 100644 --- a/examples/formats/http/python/requirements.txt +++ b/examples/formats/http/python/requirements.txt @@ -1,2 +1,2 @@ -hotfn -uvloop +fdk==0.0.1 +uvloop==0.8.1 diff --git a/examples/formats/json/python/func.py b/examples/formats/json/python/func.py new file mode 100644 index 000000000..0b2e001d9 --- /dev/null +++ b/examples/formats/json/python/func.py @@ -0,0 +1,20 @@ +import fdk + + +def handler(context, data=None, loop=None): + """ + This is just an echo function + :param context: request context + :type context: hotfn.http.request.RequestContext + :param data: request body + :type data: object + :param loop: asyncio event loop + :type loop: asyncio.AbstractEventLoop + :return: echo of request body + :rtype: object + """ + return data + + +if __name__ == "__main__": + fdk.handle(handler) diff --git a/examples/formats/json/python/func.yaml b/examples/formats/json/python/func.yaml new file mode 100644 index 000000000..32f4eb006 --- /dev/null +++ b/examples/formats/json/python/func.yaml @@ -0,0 +1,7 @@ +name: fnproject/hot-json-python +version: 0.0.1 +runtime: python3.6.2 +type: sync +memory: 256 +format: json +path: /hot-json-python diff --git a/examples/formats/json/python/requirements.txt b/examples/formats/json/python/requirements.txt new file mode 100644 index 000000000..58e01139e --- /dev/null +++ b/examples/formats/json/python/requirements.txt @@ -0,0 +1 @@ +fdk==0.0.1