Added api server shutdown function, and exposed on HTTP as /stop_api url

This will stop the running app gracefully - processing current api calls
then shutting the werkzueg (run) listening server.

Have also called this from the cleanup placeholder.
I'm not sure this is what is intended by cleanup def.
By which I mean there may be a thread left running with no app within -
not sure how to check this just yet.

tidied excessive logging.
This commit is contained in:
creslinux 2018-06-23 11:53:09 +00:00
parent dc1aebf391
commit ab2cf1bbfe

View File

@ -41,6 +41,7 @@ class ApiServerSuperWrap(RPC):
""" """
app.register_error_handler(404, self.page_not_found) app.register_error_handler(404, self.page_not_found)
app.add_url_rule('/', 'hello', view_func=self.hello, methods=['GET']) app.add_url_rule('/', 'hello', view_func=self.hello, methods=['GET'])
app.add_url_rule('/stop_api', 'stop_api', view_func=self.stop_api, methods=['GET'])
def register_rest_rpc_urls(self): def register_rest_rpc_urls(self):
""" """
@ -77,10 +78,6 @@ class ApiServerSuperWrap(RPC):
except Exception: except Exception:
logger.exception("Api server failed to start, exception message is:") logger.exception("Api server failed to start, exception message is:")
def cleanup(self) -> None:
# TODO: implement me
raise NotImplementedError
@property @property
def name(self) -> str: def name(self) -> str:
# TODO: implement me # TODO: implement me
@ -90,11 +87,43 @@ class ApiServerSuperWrap(RPC):
# TODO: implement me # TODO: implement me
raise NotImplementedError raise NotImplementedError
def shutdown_api_server(self):
"""
Stop the running flask application
Records the shutdown in logger.info
:return:
"""
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running the Flask Werkzeug Server')
if func is not None:
logger.info('Stopping the Local Rest Server')
func()
return
def cleanup(self) -> None:
"""
Stops the running application server
Does not stop the thread,this may not be the desired outcome of cleanup. TBC
:return:
"""
self.shutdown_api_server()
# def cleanup(self) -> None:
# # TODO: implement me
# raise NotImplementedError
""" """
Define the application methods here, called by app.add_url_rule Define the application methods here, called by app.add_url_rule
each Telegram command should have a like local substitute each Telegram command should have a like local substitute
""" """
def stop_api(self):
""" For calling shutdown_api_server over via api server HTTP"""
self.shutdown_api_server()
return 'Api Server shutting down... '
def page_not_found(self, error): def page_not_found(self, error):
# Return "404 not found", 404. # Return "404 not found", 404.
return jsonify({'status': 'error', return jsonify({'status': 'error',
@ -110,11 +139,16 @@ class ApiServerSuperWrap(RPC):
:return: index.html :return: index.html
""" """
rest_cmds = 'Commands implemented: <br>' \ rest_cmds = 'Commands implemented: <br>' \
'<a href=/daily?timescale=7>/daily?timescale=7</a>' \ '<a href=/daily?timescale=7>Show 7 days of stats</a>' \
'<br>' \ '<br>' \
'<a href=/stop>/stop</a>' \ '<a href=/stop>Stop the Trade thread</a>' \
'<br>' \ '<br>' \
'<a href=/start>/start</a>' '<a href=/start>Start the Traded thread</a>' \
'<br>' \
'<a href=/paypal> 404 page does not exist</a>' \
'<br>' \
'<br>' \
'<a href=/stop_api>Shut down the api server - be sure</a>'
return rest_cmds return rest_cmds
def daily(self): def daily(self):
@ -125,7 +159,6 @@ class ApiServerSuperWrap(RPC):
""" """
try: try:
timescale = request.args.get('timescale') timescale = request.args.get('timescale')
logger.info("LocalRPC - Daily Command Called")
timescale = int(timescale) timescale = int(timescale)
stats = self._rpc_daily_profit(timescale, stats = self._rpc_daily_profit(timescale,