FlaskAPI.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import threading
  2. from flask import jsonify
  3. from flask import request
  4. from flask_restful import abort
  5. from core import OrderAnalyser
  6. from core.RestAPI.utils import requires_auth
  7. from core.SynapseLauncher import SynapseLauncher
  8. class FlaskAPI(threading.Thread):
  9. def __init__(self, app, port=5000, brain=None):
  10. """
  11. :param app: Flask API
  12. :param port: Port to listen
  13. :param brain: Brain object
  14. :type brain: Brain
  15. """
  16. super(FlaskAPI, self).__init__()
  17. self.app = app
  18. self.port = port
  19. self.brain = brain
  20. self.app.add_url_rule('/synapses/', view_func=self.get_synapses, methods=['GET'])
  21. self.app.add_url_rule('/synapses/<synapse_name>', view_func=self.get_synapse, methods=['GET'])
  22. self.app.add_url_rule('/synapses/<synapse_name>', view_func=self.run_synapse, methods=['POST'])
  23. self.app.add_url_rule('/order/', view_func=self.run_order, methods=['POST'])
  24. def run(self):
  25. self.app.run(host='0.0.0.0', port="%s" % int(self.port), debug=True, threaded=True, use_reloader=False)
  26. def _get_synapse_by_name(self, synapse_name):
  27. """
  28. Find a synapse in the brain by its name
  29. :param synapse_name:
  30. :return:
  31. """
  32. all_synapse = self.brain.brain_yaml
  33. for el in all_synapse:
  34. print el
  35. if el[0]["name"] in synapse_name:
  36. return el[0]
  37. return None
  38. @requires_auth
  39. def get_synapses(self):
  40. """
  41. get all synapse
  42. """
  43. data = jsonify(synapses=self.brain.brain_yaml)
  44. return data, 200
  45. @requires_auth
  46. def get_synapse(self, synapse_name):
  47. """
  48. get a synapse by its name
  49. """
  50. synapse_target = self._get_synapse_by_name(synapse_name)
  51. if synapse_target is not None:
  52. data = jsonify(synapses=synapse_target)
  53. return data, 200
  54. data = {
  55. "synapse name not found": "%s" % synapse_name
  56. }
  57. return jsonify(error=data), 404
  58. @requires_auth
  59. def run_synapse(self, synapse_name):
  60. """
  61. Run a synapse by its name
  62. test with curl:
  63. curl -i --user admin:secret -X POST http://localhost:5000/synapses/say-hello
  64. :param synapse_name:
  65. :return:
  66. """
  67. synapse_target = self._get_synapse_by_name(synapse_name)
  68. if synapse_target is None:
  69. data = {
  70. "synapse name not found": "%s" % synapse_name
  71. }
  72. return jsonify(error=data), 404
  73. # run the synapse
  74. SynapseLauncher.start_synapse(synapse_name, brain=self.brain)
  75. data = jsonify(synapses=synapse_target)
  76. return data, 201
  77. @requires_auth
  78. def run_order(self):
  79. """
  80. Give an order to Kalliope via API like it was from a spoken one
  81. Test with curl
  82. curl -i --user admin:secret -H "Content-Type: application/json" -X POST -d '{"order":"my order"}' http://localhost:5000/order
  83. In case of quotes in the order or accents, use a file
  84. cat post.json:
  85. {"order":"j'aime"}
  86. curl -i --user admin:secret -H "Content-Type: application/json" -X POST --data @post.json http://localhost:5000/order/
  87. :return:
  88. """
  89. if not request.get_json() or 'order' not in request.get_json():
  90. abort(400)
  91. order = request.get_json('order')
  92. if order is not None:
  93. # get the order
  94. order_to_run = order["order"]
  95. oa = OrderAnalyser(order=order_to_run, brain=self.brain)
  96. launched_synapses = oa.start()
  97. if launched_synapses:
  98. # if the list is not empty, we have launched one or more synapses
  99. data = jsonify(synapses=[e.serialize() for e in launched_synapses])
  100. return data, 201
  101. else:
  102. data = {
  103. "error": "The given order doesn't match any synapses"
  104. }
  105. return jsonify(error=data), 400
  106. else:
  107. data = {
  108. "error": "order cannot be null"
  109. }
  110. return jsonify(error=data), 400