Al solicitar el servicio de notificaciones en NUBIX API es posible realizar la configuración de dicho servicio de la siguiente forma:

Importar librerías y crear ruta.

import json, re, requests as request
from flask import Flask
from flask import request as req

app = Flask(__name__)

@app.route('/', methods = ['POST'])
...

Como primer requisito y para facilitar la manipulación de la información es necesario la implementación de cuatro librerías: flask, json, re y request. Además creamos la ruta en el dominio https://dominio.ext/.

Recibir el mensaje.

def example():
try:
message = json.loads(req.data)
except:
pass
...

Se define la función que manejará la información, recibiendo cómo argumento la información a la solicitud POST (req) en la ruta indicada https://dominio.ext/. Posteriormente se convierte el mensaje a formato JSON, de no ser así se realiza el manejo de la excepción.

Se obtiene tipo.

    type = req.headers.get('X-Amz-Sns-Message-Type')

if type == 'SubscriptionConfirmation' and 'SubscribeURL' in message:
...
elif type == 'Notification':
...
else:
return 'ERROR' 400

Se verificarán dos opciones de tipo, la primera será la confirmación de la suscripción, de no ser esta la opción que se solicita, entonces se valida si es una notificación, en caso de que el mensaje no sea ninguna de las dos se envía el código de error 400.

Confirmar suscripción.

    if type == 'SubscriptionConfirmation' and 'SubscribeURL' in message:
r = request.get(message['SubscribeURL'])
return 'OK', 200

Se realiza la comparación de la cadena de tipo (type) con la cadena de confirmación de la suscripción ('SubscriptionConfirmation'), si esta es igual entonces, se obtiene la información del GET REQUEST a la URL que recibe de la ruta indicada a través de la cadena 'SubscribeURL'  devolviendo el código 200.

Notificación. 

    elif type == 'Notification':
subject = message['Subject']
if subject == 'New Study':
...
elif subject == 'New Interpretation':
...
else:
return 'ERROR', 400

Se realiza la comparación del texto tipo (type) con el texto de notificación ('Notification'), si es igual, entonces se obtiene la información del JSON para Subject, almacenándola en la variable subject la cual debe ser revisada, ya que en NUBIX se cuenta con dos tipos de notificaciones; una para indicar un estudio nuevo('New Study') y otra que informa acerca de una nueva interpretación('New Interpretation'), de no ser ninguna de estas se envía el error 400.

Notificación de nuevo estudio.

    if subject == 'New Study':
      print(json.loads(message['Message']))
      return 'OK', 200

Una vez que contamos con la información correspondiente de subject se debe verificar el tipo de notificación, por lo que se realizará una primera comparación donde se validará si la notificación corresponde a un nuevo estudio en la plataforma, indicando el código 200.

Notificación de nueva interpretación.

      elif subject == 'New Interpretation':
        print(json.loads(message['Message']))
        return 'OK', 200

O si corresponde a una nueva interpretación, regresando el código 200.

A continuación se muestra el código completo del archivo ejemplo.py en la ruta https://dominio.ext/, le recomendamos utilizar Ultrahoook durante la fase de desarrollo:

from flask import Flask
from flask import request as req

app = Flask(__name__)

@app.route('/', methods = ['POST'])
def example():
try:
message = json.loads(req.data)
except:
pass
type = req.headers.get('X-Amz-Sns-Message-Type')

if type == 'SubscriptionConfirmation' and 'SubscribeURL' in message:
r = request.get(message['SubscribeURL'])
return 'OK', 200
elif type == 'Notification':
subject = message['Subject']
if subject == 'New Study':
print(json.loads(message['Message']))
return 'OK', 200
elif subject == 'New Interpretation':
print(json.loads(message['Message']))
return 'OK', 200
else:
return 'ERROR', 400
else:
return 'ERROR', 400

if __name__ == '__main__':
app.run(host = 'localhost')

Ver en GitHub Gist