Estoy tratando con una aplicación de Python que consiste en múltiples componentes livianos distribuidos que se comunican usando RabbitMQ & Kombu.Agregar comportamiento REST a una clase con matraz, caso de planos?
Un componente escucha en dos colas y puede recibir múltiples tipos de mensajes en cada cola. Las subclases pueden anular la forma en que se procesa cada tipo de mensaje registrando controladores personalizados. Todo esto funciona bien.
Ahora tengo el requisito adicional de que cada componente debe tener una interfaz REST/HTML básica. La idea es que apunte su navegador al componente en ejecución y obtenga información en tiempo real sobre lo que está haciendo actualmente (qué mensajes está procesando, uso de la CPU, información de estado, registro, etc.)
Tiene que ser liviano, por lo que después de algunas investigaciones me he decidido por Flask (pero estoy abierto a sugerencias). En pseudocódigo esto significa tomar:
class Component:
Queue A
Queue B
...
def setup(..):
# connect to the broker & other initialization
def start(..):
# start the event loop and wait for work
def handle_msg_on_A(self,msg):
# dispatch a msg to a handler depending on the msg type
def handle_msg_on_B(self,msg):
...
...
y la adición de una serie de métodos de vista:
@app.route('/')
def web_ui(self):
# render to a template
@app.route('/state')
def get_state(self):
# REST method to return some internal state info as JSON
...
Sin embargo, las gasas y una interfaz web a una clase como esta se rompe SOLID principios y trae problemas con la herencia (una subclase puede querer mostrar más/menos información). Los decoradores no se heredan, por lo que todos los métodos de vista deberían anularse y redefinirse explícitamente. Tal vez usar una reflexión mixin + podría funcionar de alguna manera, pero se siente hackish.
En su lugar, el uso de la composición podría funcionar: coloque el elemento web en una clase separada que delegue las rutas url en un conjunto fijo y predefinido de métodos polimórficos en el componente anidado. De esta forma, los componentes permanecen ajenos a Flask a costa de una pérdida de flexibilidad (el conjunto de métodos disponibles es fijo).
Ahora he descubierto Flask blueprints y Application Dispatching y parece que podrían traer una solución mejor y más extensible. Sin embargo, todavía tengo que envolver mi cabeza alrededor de ellos.
Siento que me falta un patrón de diseño aquí y espero que alguien con más flask-fu o experiencia con este tipo de problema pueda comentar.
Enfriar, gracias por la respuesta, definitivamente lo analizará y aprobará la respuesta si funciona – dgorissen
¿Funcionó @dgorissen –