Guía 22

Guía 22

DAWM / Proyecto05

Objetivo general

Desarrollar una aplicación backend robusta y escalable utilizando Django que integre una interfaz de administrador intuitiva para la gestión eficiente de datos y funcionalidades junto con un REST API completo que facilite la comunicación con las aplicaciones cliente de tal forma que garantice la seguridad, el rendimiento y la extensibilidad del sistema.

Actividades previas

Ambiente de desarrollo

  1. Desde la línea de comandos

    • Cree y habilite el ambiente de desarrollo, con:
     python -m venv environment
     environment\Scripts\activate
    

Repositorio local/remoto + librerías

  1. Desde la línea de comandos

    • Clone localmente y acceda a la carpeta backend.
    • Instale las librerías de requirements.txt, con:
     pip install -r requirements.txt
    
    • Instale firebase-admin y djangorestframework (DRF), con:
     pip install firebase-admin djangorestframework
    

Editor y WSGI

  1. Abra el proyecto con VSCode, con:

     code .
    
  2. Levante el servidor, con:

     python manage.py runserver
    

Actividades en clases

SDK Firebase Admin

  1. Acceda a la consola de Firebase
  2. Ingrese al proyecto landing
    • Acceda a la Configuración de proyecto > Cuentas de servicio > SDK de Firebase Admin.
    • Haga clic en Genera una clave privada. Guarde el archivo en la carpeta keys con el nombre landing-key.json.
     backend/	
     ├── backend/ 
     ├── main/					
     ├── static/				
     └── templates/
     ├── ....
     └── keys/			<!-- clave -->
         	└──landing-key.json
    
  3. En el servicio de Realtime Database, copie la URL de referencia.

  4. (STOP 1) Edite el archivo backend/settings.py, con:

    • Importe los módulos firebase_admin y credentials
    • Coloque la ruta relativa al archivo con la clave privada
    • Inicialice la conexión con el Realtime Database con la clave privada y la URL de referencia.
     ...
     from ... import Path
    
     # Importe los módulos firebase_admin y credentials
     import firebase_admin
     from firebase_admin import credentials
    
     ...
    
     # Coloque la ruta relativa al archivo con la clave privada
     FIREBASE_CRED = credentials.Certificate("keys/landing-key.json")
    
     # Inicialice la conexión con el Realtime Database con la clave privada y la URL de referencia
     firebase_admin.initialize_app(FIREBASE_CRED, {
         'databaseURL': 'https://landing-XXXXX-default-rtdb.firebaseio.com/'
     })
    

Aplicación: REST

  1. Desde la línea de comandos

    • Cree la aplicación api, con:
     python manage.py startapp api
    
  2. Edite el archivo backend/settings.py, con:

    • Registre la aplicación api y rest_framework
     INSTALLED_APPS = [
         ...
         'rest_framework',
         'api',
     ]
    
  3. Edite el archivo backend/urls.py, con:

    • Asocie la ruta api con las rutas de la aplicación api
     ...
    
     urlpatterns = [
         ...
         path('api/', include('api.urls')),
     ]
    
  4. Cree y modifique el archivo api/urls.py, con:

    • Asocie la ruta ‘v1/landing/’ con la vista LandingAPI
     from django.urls import path
     from . import views
    
     urlpatterns = [
         path('v1/landing/', views.LandingAPI.as_view(), name='firebase_resources' ),
     ]
    
  5. Edite el archivo api/views.py, con:

    • Importe la clase APIView, Response y status de DRF; el módulo datetime y la referencia al Firebase SDK.
    • Agregue LandingAPI que herede de APIView (class-based view). Incluya los atributos name y collection_name (nombre de la colección en Realtime Database).
     ...
    
     # Create your views here.
    
     from rest_framework.views import APIView
     from rest_framework.response import Response
     from rest_framework import status
    
     from datetime import datetime
    	
     from firebase_admin import db
    
     class LandingAPI(APIView):
    	    
         name = 'Landing API'
    
         # Coloque el nombre de su colección en el Realtime Database
         collection_name = 'COLLECTION_NAME_REALTIME_DATABASE'
    
  6. Desde la línea de comandos

    • Levante el servidor, con:
     python manage.py runserver
    
  7. (STOP 2) Revise los cambios en el navegador para las URLs:

GET

  1. Edite el archivo api/views.py, con:

    • Modifique función get mediante el uso del SDK
      • Obtenga una referencia a la colección, con reference
      • Obtenga un arreglo con todos los elementos de la colección en formato JSON, con get.
     ...
    
     class LandingAPI(APIView):
        
     	...
        
         def get(self, request):
    
             # Referencia a la colección
             ref = db.reference(f'{self.collection_name}')
    		    
             # get: Obtiene todos los elementos de la colección
             data = ref.get()
    
             # Devuelve un arreglo JSON
             return Response(data, status=status.HTTP_200_OK)
    
  2. (STOP 3 - I) Revise los cambios en el navegador para las URLs:

  3. (STOP 3 - II) Desde una nueva línea de comandos

    • Realice una petición con cURL, con:
     curl -X GET http://127.0.0.1:8000/api/v1/landing/
    

POST

  1. Edite el archivo api/views.py, con:

    • Modifique función post mediante el uso del SDK
      • Obtenga una referencia a la colección, con reference
      • Envíe un objeto JSON a la colección, con push.
     ...
    
     class LandingAPI(APIView):
        
     	...
        
         def post(self, request):
    	        
             # Referencia a la colección
             ref = db.reference(f'{self.collection_name}')
    
             current_time  = datetime.now()
             custom_format = current_time.strftime("%d/%m/%Y, %I:%M:%S %p").lower().replace('am', 'a. m.').replace('pm', 'p. m.')
             request.data.update({"saved": custom_format })
    	        
             # push: Guarda el objeto en la colección
             new_resource = ref.push(request.data)
    	        
             # Devuelve el id del objeto guardado
             return Response({"id": new_resource.key}, status=status.HTTP_201_CREATED)
    
  2. (STOP 4 - I) Revise los cambios en el navegador para las URLs:

     {
         "email": "usuarioYY@gmail.com"
     }
    
  3. (STOP 4 - II) Desde una nueva línea de comandos

    • Realice una petición con cURL, con:
     curl -X POST -H "Content-Type: application/json" -d "{\"email\":\"usuarioXX@gmail.com\"}" http://127.0.0.1:8000/api/v1/landing/
    

Versionamiento local y remoto

  1. En la línea de comandos

    • Genere el archivo requirements.txt con la lista de paquetes utilizados, con:
     pip freeze > requirements.txt
    
    • Desactive el ambiente de desarrollo, con:
     deactivate
    
  2. Agregue la carpeta keys/ en el archivo .gitignore

     ...
    
     # Keys
     keys/
    
  3. Versione local y remotamente.

Documentación

Fundamental

Términos

api, class-based view, cURL

Referencias