Source code for receiver

# -*- coding: utf-8 -*-
"""receiver.py

Provides the Receiver, which listens to the given address and reacts on data.
The method :meth:`Receiver.on_data` is called upon a valid json message. Start
it by calling :func:`~Receiver.listen`.

This implementation uses Flask (http://flask.pocoo.org/)!
"""
from flask import Flask, request, json, Response
# ATTENTION: The imported json is a custom implementation of the internal json
#            module. https://github.com/pallets/flask/blob/master/flask/json.py
import logging


[docs]class Receiver(Flask): """Receiver See module description. """ def __init__(self, name, address, port): """Receiver(name, address, port) Instantiates the Receiver. Start the service via :func:`~Receiver.listen`. :param name: Name of the receiver. (str) :param address: Address to listen on. (str) :param port: Port to listen on. (int) """ self.log = logging.getLogger(self.__class__.__name__) super(Receiver, self).__init__(name) self.name = name self.address = address self.port = port self.on_data = None
[docs] def listen(self, route, on_data): """Listen on *route* and call *on_data*. :param route: The path to listen on. (str) :param on_data: The callback function. (func(json)) """ self.on_data = on_data self.route(route, methods=['POST'])(self.__handle_post) self.run(host=self.address, port=self.port, debug=False)
def __handle_post(self): if 'application/json' in request.headers.get('Content-Type'): try: data = request.json # TODO build more sensible checks data = json.loads(json.dumps(data)) self.log.debug(data) self.on_data(data) except Exception: self.log.error("Failed to read POST-data.", exc_info=True) return Response('Bad Request', 400) return Response('OK', 200) return Response('Unsupported Media Type', 415)