La integración de un modo de mantenimiento en el proceso de desarrollo de una aplicación web es similar a la instalación de una red de seguridad debajo de un acto de cable alto. Es un enfoque estratégico que ofrece numerosos beneficios, asegurando una experiencia más fluida y centrada en el usuario durante todo el ciclo de vida de la aplicación. El modo de mantenimiento proporciona a los desarrolladores los medios para ajustar, actualizar y solucionar los problemas de su creación sin someter a los usuarios a interrupciones o errores inesperados. Este enfoque proactivo no solo refleja un compromiso con la calidad, sino que también mejora la confianza del usuario, minimiza el tiempo de inactividad y, en última instancia, da como resultado una aplicación web más robusta y confiable. En esta publicación, nuestro objetivo es entrar en las razones convincentes por las que tener un modo de mantenimiento no solo es bueno, sino fundamental, para el desarrollo de una aplicación web exitosa.
Para esta demostración, usaremos Python (Django). Antes de empezar, asumimos que tienes Python 3 instalado en tu entorno. En un directorio de su elección, ejecute lo siguiente:
django-admin startproject maintenance_mode_app
Ahora, intenta ir a ese directorio y configurar un entorno de Python, en el que instalaremos algunas bibliotecas de Python, incluido django. Se pueden encontrar instrucciones sobre cómo crear un entorno aquí. En esta demostración, mi entorno se llama "venv". A continuación, ejecutémos los siguientes comandos para crear la aplicación de mantenimiento en el proyecto. Esto creará un directorio que contendrá las "views" y Urls junto con cualquier otro archivo de Python que necesitemos crear allí para configurar el modo de mantenimiento en el proyecto.
source venv/bin/activate
pip3 install django
python3 manage.py startapp base_app
python3 manage.py startapp maintenance
En este punto, si ejecutas un comando "tree" en la maintenance_mode_app, deberías ver el siguiente árbol:

Si ejecutamos el siguiente comando dentro del directorio maintenance_mode_app, deberíamos ver que el proyecto se sirve en una URL de localhost. El mío se sirve en http://localhost:8000, como se ve a continuación:
python3 manage.py runserver

Puede seguir el mismo método que utilizamos para crear la base_app y las aplicaciones de mantenimiento para crear tantas aplicaciones como sea necesario, según las necesidades de su negocio.
Ahora hemos creado la aplicación "maintenance" dentro de nuestra aplicación y estamos listos para crear un middleware para ella. Vamos a crear un archivo middleware.py dentro del directorio de mantenimiento y añadirle el siguiente contenido:
from django.shortcuts import reverse, redirect
from django.conf import settings
class MaintenanceModeMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
path = request.META.get('PATH_INFO', "")
query = request.META.get('QUERY_STRING', "")
if settings.MAINTENANCE_BYPASS_QUERY in query:
request.session['bypass_maintenance'] = True
if not request.session.get('bypass_maintenance', False):
if settings.MAINTENANCE_MODE and path!= reverse("maintenance:maintenance"):
response = redirect(reverse("maintenance:maintenance"))
return response
if not settings.MAINTENANCE_MODE and path == reverse("maintenance:maintenance"):
response = redirect(reverse("base_app:index"))
return response
response = self.get_response(request)
return response
Lo que este archivo le dice al servidor es que cree un middleware en el que enrutaremos cualquier nueva solicitud a la página de mantenimiento si el modo de mantenimiento está activado y la contraseña de bypass no se establece como parámetro en el navegador. Así que ahora vayamos al archivo maintenance_mode_app/settings.py y registremos el servicio de middleware. Añade lo siguiente a la sección MIDDLEWARE:
'maintenance.middleware.MaintenanceModeMiddleware'
Además, en INSTALLED_APPS, agreguemos lo siguiente para registrar la base_app y las aplicaciones de mantenimiento:
'base_app',
'maintenance'
Luego, lo siguiente en la parte inferior del archivo settings.py. Aquí es donde le decimos al middleware si el modo de mantenimiento está configurado o no cambiando de 0 a 1 y viceversa:
MAINTENANCE_MODE = int(os.environ.get("MAINTENANCE_MODE", 0))
MAINTENANCE_BYPASS_QUERY = os.environ.get("MAINTENANCE_BYPASS_QUERY")
Por último, tendremos que añadir una cosa más a ese archivo, pero antes de hacerlo, en el directorio raíz del proyecto, vamos a crear un directorio llamado "plantillas". Aquí es donde almacenaremos los archivos HTML que necesitaremos para servir las páginas necesarias para esta demostración. Una vez creado, volvemos al archivo settings.py y hacemos el siguiente cambio en el DIRS en la sección PLANTILLAS:
'DIRS': [os.path.join(BASE_DIR, 'templates')],
Ahora, todos estamos listos desde la perspectiva de la configuración del proyecto. Vamos a crear las "views" y los Urls para las páginas necesarias. En el archivo base_app/views.py, añadamos lo siguiente:
from django.shortcuts import render
def index(request):
return render(request, 'base_app/index.html')
En el archivo maintenance/views.py:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse('This is the homepage')
def maintenance(request):
return render(request, 'maintenance/maintenance.html')
En el archivo base_app/urls.py:
from django.urls import path
from . import views
app_name = 'base_app'
urlpatterns = [
path('', views.index, name='index'),
]
En el archivo maintenance/urls.py:
from django.urls import path
from . import views
app_name = 'maintenance'
urlpatterns = [
path('maintenance', views.maintenance, name='maintenance'),
]
Luego, registramos estas Urls en la aplicación agregando lo siguiente al archivo maintenance_mode_app/urls.py antes del cierre ]:
path('', include('base_app.urls')),
path('maintenance/', include('maintenance.urls')),
Por último, creamos 2 archivos HMTL templates/base_app/index.html y templates/maintenance/maintenance.html de la siguiente manera:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Homepage</title>
</head>
<body>
<h1>Welcome</h1>
<p>This is the home page and where the app should be rendered when served.</p>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Maintenance mode</title>
</head>
<body>
<h1>Maintenance mode</h1>
<p>We are currently performing maintenance on this site and it will be available shortly. We apologize for any inconvenience. For urgent needs, please reach out to email@example.com</p>
</body>
</html>
Ahora, si cambiamos el MODO DE MANTENIMIENTO de 0 a 1 en el archivo settings.py, ejecute lo siguiente antes de reiniciar el servidor:
export MAINTENANCE_BYPASS_QUERY=bypass_password=maintenance
Después de reiniciar el servidor, si volvemos a http://127.0.0.1:8000/ o donde sea que comiencen sus servidores, debería ver lo siguiente:

Esto muestra que cualquier usuario que intente llegar a la aplicación sería dirigido a la página de mantenimiento. Por el contrario, si volvemos al navegador y en su lugar entramos en http://127.0.0.1:8000/? Bypass_password=maintenance, deberíamos ver la página de índice (página de inicio) que se sirve normalmente, como se ve a continuación:

En última instancia, si el usuario forma parte de su equipo de DevOps o de desarrolladores, conocería la contraseña de mantenimiento, que por supuesto no debería ser solo la palabra "mantenimiento", sino que la idea es que solo los usuarios con el parámetro correcto de bypass_password puedan acceder a la aplicación durante el período de mantenimiento. Una vez que se haya completado el mantenimiento, todo lo que tendría que hacer es volver al archivo settings.py y cambiar la configuración a 0.
En conclusión, agregar un modo de mantenimiento a un sitio web es importante porque le permite desconectar temporalmente su sitio o restringir el acceso a los usuarios mientras realiza actualizaciones, actualizaciones o correcciones. Esto ayuda a garantizar una experiencia de usuario fluida y evita posibles errores o interrupciones durante el proceso de mantenimiento. También comunica transparencia y profesionalismo a los visitantes, informándoles de que el sitio está experimentando mejoras en lugar de ser roto.