diff --git a/sanic/sanic.py b/sanic/sanic.py index 53604791..3afc13d2 100644 --- a/sanic/sanic.py +++ b/sanic/sanic.py @@ -30,7 +30,7 @@ class Sanic: return response - def run(self, host="127.0.0.1", port=8000, debug=False): + def run(self, host="127.0.0.1", port=8000, debug=False, on_start=None, on_stop=None): self.error_handler.debug=True self.debug = debug - return serve(sanic=self, host=host, port=port, debug=debug) \ No newline at end of file + return serve(sanic=self, host=host, port=port, debug=debug, on_start=on_start, on_stop=on_stop) \ No newline at end of file diff --git a/sanic/server.py b/sanic/server.py index a33f9933..e8e8fd1e 100644 --- a/sanic/server.py +++ b/sanic/server.py @@ -23,8 +23,6 @@ from .exceptions import ServerError from .response import HTTPResponse from .request import Request -PRINT = 0 - class HttpProtocol(asyncio.Protocol): __slots__ = ('loop', @@ -158,7 +156,7 @@ def abort(msg): log.info(msg, file=sys.stderr) sys.exit(1) -def serve(sanic, host, port, debug=False): +def serve(sanic, host, port, debug=False, on_start=None, on_stop=None): # Create Event Loop loop = async_loop.new_event_loop() asyncio.set_event_loop(loop) @@ -179,10 +177,21 @@ def serve(sanic, host, port, debug=False): # Serve log.info('Goin\' Fast @ {}:{}'.format(host, port)) + if on_start: + print("start1") + result = on_start(sanic, loop) + if isawaitable(result): + print("start2") + loop.run_until_complete(result) + server_coroutine = loop.create_server(lambda: HttpProtocol(loop=loop, sanic=sanic), host, port) server_loop = loop.run_until_complete(server_coroutine) try: loop.run_forever() finally: + if on_stop: + result = on_stop(sanic, loop) + if isawaitable(result): + loop.run_until_complete(result) server_loop.close() loop.close() \ No newline at end of file diff --git a/test.py b/test.py deleted file mode 100644 index 5816a2b4..00000000 --- a/test.py +++ /dev/null @@ -1,27 +0,0 @@ -from sanic import Sanic -from sanic.response import json, text -from sanic.exceptions import ServerError - -app = Sanic("test") - -@app.route("/") -async def test(request): - return json({ "test": True }) - -@app.route("/exception") -def test(request): - raise ServerError("yep") - -@app.route("/exception/async") -async def test(request): - raise ServerError("asunk") - -@app.route("/post_json") -def test(request): - return json({ "received": True, "message": request.json }) - -@app.route("/query_string") -def test(request): - return json({ "parsed": True, "args": request.args, "url": request.url, "query_string": request.query_string }) - -app.run(host="0.0.0.0") \ No newline at end of file diff --git a/test.go b/tests/golang.http.go similarity index 100% rename from test.go rename to tests/golang.http.go diff --git a/test.aiohttp.py b/tests/python.aiohttp.py similarity index 100% rename from test.aiohttp.py rename to tests/python.aiohttp.py diff --git a/tests/python.sanic.py b/tests/python.sanic.py new file mode 100644 index 00000000..43df5b9e --- /dev/null +++ b/tests/python.sanic.py @@ -0,0 +1,83 @@ +import asyncpg +import sys +import os +import inspect + +currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) +parentdir = os.path.dirname(currentdir) +sys.path.insert(0,parentdir) + +from sanic import Sanic +from sanic.response import json, text +from sanic.exceptions import ServerError + +app = Sanic("test") + +@app.route("/") +async def test(request): + return json({ "test": True }) + + + +import asyncio_redis +import asyncpg +async def setup(sanic, loop): + sanic.conn = [] + sanic.redis = [] + for x in range(10): + sanic.conn.append(await asyncpg.connect(user='postgres', password='zomgdev', database='postgres', host='192.168.99.100')) + for n in range(30): + connection = await asyncio_redis.Connection.create(host='192.168.99.100', port=6379) + sanic.redis.append(connection) + + +c=0 +@app.route("/postgres") +async def postgres(request): + global c + values = await app.conn[c].fetch('''SELECT * FROM players''') + c += 1 + if c == 10: + c = 0 + return text("yep") + +r=0 +@app.route("/redis") +async def redis(request): + global r + try: + values = await app.redis[r].get('my_key') + except asyncio_redis.exceptions.ConnectionLostError: + app.redis[r] = await asyncio_redis.Connection.create(host='127.0.0.1', port=6379) + values = await app.redis[r].get('my_key') + + r += 1 + if r == 30: + r = 0 + return text(values) + + + + +@app.route("/text") +def rtext(request): + return text("yeehaww") + +@app.route("/exception") +def exception(request): + raise ServerError("yep") + +@app.route("/exception/async") +async def test(request): + raise ServerError("asunk") + +@app.route("/post_json") +def post_json(request): + return json({ "received": True, "message": request.json }) + +@app.route("/query_string") +def query_string(request): + return json({ "parsed": True, "args": request.args, "url": request.url, "query_string": request.query_string }) + +import sys +app.run(host="0.0.0.0", port=sys.argv[1])#, on_start=setup)