Creación de una app en Python que comunique con Firebase

En este proyecto vamos a implementar una aplicación que permite comunicar con Firebase, descargar información y enviar correos eléctronicos.

Por último os invito que visiteis el video https://www.youtube.com/watch?v=QKFBKafxeco dónde realizo un análisis del artículo.

Introducción

Firebase es una plataforma para el desarrollo de aplicaciones web y aplicaciones móviles lanzada en 2011 y adquirida por Google en 2014.

Es una plataforma ubicada en la nube, integrada con Google Cloud Platform, que usa un conjunto de herramientas para la creación y sincronización de proyectos que serán dotados de alta calidad, haciendo posible el crecimiento del número de usuarios y dando resultado también a la obtención de una mayor monetización.

Los desarrolladores tendrán una serie de ventajas al usar esta plataforma:

  • Sincronizar fácilmente los datos de sus proyectos sin tener que administrar conexiones o escribir lógica de sincronización compleja.
  • Usa un conjunto de herramientas multiplataforma: se integra fácilmente para plataformas web como en aplicaciones móviles. Es compatible con grandes plataformas, como IOS, Android, aplicaciones web, Unity y C++.
  • Usa la infraestructura de Google y escala automáticamente para cualquier tipo de aplicación, desde las más pequeñas hasta las más potentes.
  • Crea proyectos sin necesidad de un servidor: Las herramientas se incluyen en los SDK para los dispositivos móviles y web, por lo que no es necesario la creación de un servidor para el proyecto.
  • Firebase dota a sus usuarios de una gran documentación2​ para crear aplicaciones usando esta plataforma. Aparte de esto, ofrece soporte gratuito mediante correo electrónico para todos sus usuarios, y además sus desarrolladores participan activamente en plataformas como Github y StackOverflow, así como poseen un canal de Youtube3​ explicando el funcionamiento de varias de sus herramientas.

Implementación

En nuestro ejemplo, tenemos una web dónde nuestro objetivo será enviar un email a los correos que esten almacenado en firebase. Con este objetivo se ha almacenado una serie de subastas con la siguiente estructura:

  ref{
    "FechaLimite": "01-01-2020",
    "Acceso_subasta": ["1938web@gmail.com"],
    "Activa": true,
    "Categoria": "Subasta Arte",
    "Descripcion": "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."
  }

El primer paso es installar la librerira firebase-admin. Para ello utilizaremos el siguiente comando:

pip install  firebase-admin

A partir de este momento se podrá acceder al contenido almacenado en esta base de datos. Esta información está almacenada en documentos Json que podremos recuperar con el método que muestro a continuación.


  class Subasta(SecuredResource):
    def get(self,subasta):
         try
            import firebase_admin
            from firebase_admin import credentials
            from firebase_admin import firestore

            # Use a service account
            filename = os.path.join( 'clave/clave.json')
            cred = credentials.Certificate(filename)
            cred = credentials.Certificate(filename)
            try:
                firebase_admin.initialize_app(cred)
                backend_cnx = firestore.client()
            except:
                backend_cnx = firestore.client()
            # Don't use cookies
            db = backend_cnx
            # Project ID is determined by the GCLOUD_PROJECT environment variable
            subasta = 'WpZxR21fgLOtUOHeIt2b'
            doc_ref = db.collection(u'subastas').document(subasta)
            doc = doc_ref.get()
            # print(u'Document data: {}'.format(doc.to_dict()))
            enviar_email = SendEMail()
            for i in doc.to_dict()['acceso_subasta']:
                enviar_email.send_email_puja_nueva(i,doc.to_dict() )
         except:
            print('Error conexion')

  class SendEMail():
      def send_email_puja_nueva(self, para, subasta):
         import smtplib
         import datetime

         gmail_user = '1938web@gmail.com'
         gmail_password = ''

         from_address = gmail_user
         to_address = para
         today = datetime.date.today()
         today = today.strftime('%Y-%m-%d')
         asunto = "Subasta: La subasta " + subasta['titulo'][0] + 'tiene una nueva puja. '
         mensaje=  'La subasta:' + subasta['titulo'][0]  + 'tiene una nueva puja. Actualmente, la puja más alta tiene un valor de '
         + subasta['puja_ganadora'][0]
         message = """From: %s\nTo: %s\nSubject: %s\n\n%s
         	    """ % (from_address, ", ".join(to_address), asunto, mensaje)
         server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
         server.ehlo()
         server.login(gmail_user, gmail_password)
         server.sendmail(from_address, to_address, message)
         server.close()

Si analizamos el código, lo que observamos en el siguiente fragmento es cómo se obtienen las credenciales json del documento clave.json.


            import firebase_admin
            from firebase_admin import credentials
            from firebase_admin import firestore

            # Use a service account
            filename = os.path.join( 'clave/clave.json')
            cred = credentials.Certificate(filename)
            cred = credentials.Certificate(filename)
            try:
                firebase_admin.initialize_app(cred)
                backend_cnx = firestore.client()
            except:
                backend_cnx = firestore.client()

Para obtener este documento, haz click en esta dirección: https://console.cloud.google.com/projectselector/apis/api/firebasedatabase.googleapis.com/overview?hl=es Una vez obtenemos el acceso, directamente obtenemos la información de la base de datos.


            db = backend_cnx
            # Project ID is determined by the GCLOUD_PROJECT environment variable
            subasta = 'WpZxR21fgLOtUOHeIt2b'
            doc_ref = db.collection(u'subastas').document(subasta)
            doc = doc_ref.get()
            # print(u'Document data: {}'.format(doc.to_dict()))
            enviar_email = SendEMail()
            for i in doc.to_dict()['acceso_subasta']:
                enviar_email.send_email_puja_nueva(i,doc.to_dict() )