From 94bb91f2fae75c4ad49ca79ff7440128a9a3d1cd Mon Sep 17 00:00:00 2001 From: Eli Uriegas Date: Fri, 17 Feb 2017 06:54:26 -0600 Subject: [PATCH] Adds some safety around app loop property --- sanic/app.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/sanic/app.py b/sanic/app.py index 5a36fa72..028ae4d5 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -10,7 +10,7 @@ from urllib.parse import urlencode, urlunparse from sanic.config import Config from sanic.constants import HTTP_METHODS -from sanic.exceptions import ServerError, URLBuildError +from sanic.exceptions import ServerError, URLBuildError, SanicException from sanic.handlers import ErrorHandler from sanic.log import log from sanic.response import HTTPResponse @@ -50,6 +50,7 @@ class Sanic: self.debug = None self.sock = None self.listeners = defaultdict(list) + self.is_running = False # Register alternative method names self.go_fast = self.run @@ -57,6 +58,10 @@ class Sanic: @property def loop(self): """Synonymous with asyncio.get_event_loop().""" + if not self.is_running: + raise SanicException( + 'Loop can only be retrieved after the app has started ' + 'running or when not run asynchronously') return get_event_loop() # -------------------------------------------------------------------- # @@ -459,13 +464,16 @@ class Sanic: stop_event=stop_event, register_sys_signals=register_sys_signals) try: + self.is_running = True if workers == 1: serve(**server_settings) else: serve_multiple(server_settings, workers, stop_event) - except Exception as e: + except: log.exception( 'Experienced exception while trying to serve') + finally: + self.is_running = False log.info("Server Stopped") def stop(self): @@ -477,12 +485,17 @@ class Sanic: before_stop=None, after_stop=None, ssl=None, sock=None, loop=None, protocol=HttpProtocol, backlog=100, stop_event=None): - """Asynchronous version of `run`.""" + """Asynchronous version of `run`. + + NOTE: This does not support multiprocessing and is not the preferred + way to run a Sanic application. + """ server_settings = self._helper( host=host, port=port, debug=debug, before_start=before_start, after_start=after_start, before_stop=before_stop, - after_stop=after_stop, ssl=ssl, sock=sock, loop=loop, - protocol=protocol, backlog=backlog, stop_event=stop_event, + after_stop=after_stop, ssl=ssl, sock=sock, + loop=loop or get_event_loop(), protocol=protocol, + backlog=backlog, stop_event=stop_event, run_async=True) return await serve(**server_settings)