Las apps de Django que se ejecutan en el estándar de App Engine se escalan de manera dinámica según el tráfico.
En este instructivo, se da por sentado que estás familiarizado con el desarrollo web con Django. Si eres nuevo en el desarrollo de Django, te recomendamos que escribas tu primera app de Django antes de continuar.
Si bien en este instructivo se muestra Django de forma específica, puedes usar este proceso de implementación con otros marcos de trabajo basados en Django, como Wagtail y el Django CMS.
En este instructivo, se usa Django 4, que requiere al menos Python 3.8. El entorno estándar de App Engine es compatible con Python 3.7 y versiones posteriores, incluido Python 3.8.
Objetivos
En este instructivo, podrás:
- Crear y conectar una base de datos de Cloud SQL
- Crear y usar valores del Secret de Secret Manager
- Implementa una app de Django en el entorno estándar de App Engine.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Antes de comenzar
- Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
Habilita las API de Cloud SQL Admin API, Secret Manager, and Cloud Build.
- Instala Google Cloud CLI.
-
Para inicializar la CLI de gcloud, ejecuta el siguiente comando:
gcloud init
-
En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
Habilita las API de Cloud SQL Admin API, Secret Manager, and Cloud Build.
- Instala Google Cloud CLI.
-
Para inicializar la CLI de gcloud, ejecuta el siguiente comando:
gcloud init
- Si aún no lo has hecho, inicializa App Engine y selecciona tu región preferida:
gcloud app create
Prepara el entorno
Clona una app de ejemplo
El código de la app de muestra de Django está en el repositorio GoogleCloudPlatform/python-docs-samples en GitHub.
Puedes descargar la muestra como un archivo ZIP y extraerla o clonar el repositorio en tu máquina local:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Ve al directorio que contiene el código de muestra:
Linux/macOS
cd python-docs-samples/appengine/standard_python3/django
Windows
cd python-docs-samples\appengine\standard_python3\django
Confirma la configuración de Python
Este instructivo se basa en Python para ejecutar la aplicación de ejemplo en tu máquina. El código de muestra también requiere instalar dependencias
Para obtener más detalles, consulta la guía del entorno de desarrollo de Python.
Confirma que tu versión de Python sea la 3.8 como mínimo.
python -V
Deberías ver
Python 3.8.0
o una versión posterior.Crea un entorno virtual de Python y, luego, instala las dependencias:
Linux/macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
Windows
python -m venv venv venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
Descarga el proxy de autenticación de Cloud SQL para conectarte a Cloud SQL desde tu máquina local
Cuando se implementa, tu app usa el proxy de autenticación de Cloud SQL integrado en el entorno estándar de App Engine para comunicarse con la instancia de Cloud SQL. Sin embargo, para probar tu aplicación de manera local, debes instalar y usar una copia local del proxy en tu entorno de desarrollo. Para obtener más detalles, consulta la guía del proxy de autenticación de Cloud SQL.
El proxy de autenticación de Cloud SQL usa la API de Cloud SQL para interactuar con tu instancia de SQL. Para hacerlo, se requiere la autenticación de la aplicación a través de la gcloud CLI.
Autentica y adquiere credenciales para la API:
gcloud auth application-default login
Descarga y, luego, instala el proxy de autenticación de Cloud SQL en tu máquina local.
Linux de 64 bits
- Descarga el proxy de autenticación de Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.11.0/cloud-sql-proxy.linux.amd64
- Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
chmod +x cloud-sql-proxy
Linux de 32 bits
- Descarga el proxy de autenticación de Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.11.0/cloud-sql-proxy.linux.386
- Si no se encuentra el comando
curl
, ejecutasudo apt install curl
y repite el comando de descarga. - Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
chmod +x cloud-sql-proxy
macOS de 64 bits
- Descarga el proxy de autenticación de Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.11.0/cloud-sql-proxy.darwin.amd64
- Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
chmod +x cloud-sql-proxy
Mac M1
- Descarga el proxy de autenticación de Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.11.0/cloud-sql-proxy.darwin.arm64
- Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
chmod +x cloud-sql-proxy
Windows de 64 bits
Haz clic con el botón derecho en https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.11.0/cloud-sql-proxy.x64.exe y selecciona Guardar vínculo como para descargar el proxy de autenticación de Cloud SQL. Cambia el nombre del archivo porcloud-sql-proxy.exe
.Windows de 32 bits
Haz clic con el botón derecho en https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.11.0/cloud-sql-proxy.x86.exe y selecciona Guardar vínculo como para descargar el proxy de autenticación de Cloud SQL. Cambia el nombre del archivo porcloud-sql-proxy.exe
.Imagen de Docker del proxy de Cloud SQL
El proxy de autenticación de Cloud SQL tiene diferentes imágenes de contenedor, como
distroless
,alpine
ybuster
. La imagen de contenedor del proxy de autenticación de Cloud SQL predeterminada usadistroless
, que no contiene shell. Si necesitas una shell o herramientas relacionadas, descarga una imagen basada enalpine
obuster
. Para obtener más información, consulta Imágenes de contenedor del proxy de autenticación de Cloud SQL.Puedes extraer la última imagen a tu máquina local con Docker a través del siguiente comando:
docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.11.0
Otro SO
Para otros sistemas operativos que no se incluyen aquí, puedes compilar el proxy de autenticación de Cloud SQL desde la fuente.Puedes trasladar la descarga a un lugar común, como una ubicación en tu
PATH
o al directorio principal. Si decides hacer esto, cuando inicies el proxy de autenticación de Cloud SQL más adelante en el instructivo, recuerda hacer referencia a la ubicación que elegiste cuando uses los comandos decloud_sql_proxy
.- Descarga el proxy de autenticación de Cloud SQL:
Crea servicios de copia de seguridad
En este instructivo, se usan varios servicios de Google Cloud para proporcionar la base de datos, el almacenamiento de contenido multimedia y el almacenamiento secreto que respalda el proyecto implementado de Django. Estos servicios se implementan en una región específica. Para lograr una mayor eficiencia entre los servicios, todos ellos deben implementarse en la misma región. Para obtener más información sobre la región más cercana, consulta Productos disponibles por región.
En este instructivo, se usan los mecanismos integrados de hosting de elementos estáticos en el entorno estándar de App Engine.Configura una instancia de Cloud SQL para PostgreSQL
Django admite de manera oficial varias bases de datos relacionales, pero ofrece la mayor compatibilidad con PostgreSQL. PostgreSQL es compatible con Cloud SQL, por lo que en este instructivo, se elige usar ese tipo de base de datos.
En la siguiente sección, se describe la creación de una instancia de PostgreSQL, una base de datos y un usuario de base de datos para la app.
Crea la instancia de PostgreSQL:
Console
En la consola de Google Cloud, ve a la página Instancias de Cloud SQL.
Haga clic en Crear instancia.
Haz clic en PostgreSQL.
En el campo ID de instancia, ingresa
INSTANCE_NAME
.Ingresa una contraseña para el usuario de postgres.
Mantén los valores predeterminados en los otros campos.
Haz clic en Crear.
La creación de la instancia y su preparación tardará unos minutos en estar lista para usarse.
gcloud
Crea la instancia de PostgreSQL:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_13 \ --tier db-f1-micro \ --region REGION
Reemplaza lo siguiente:
INSTANCE_NAME
: Es el nombre de la instancia de Cloud SQL.PROJECT_ID
: El ID del proyecto de Google CloudREGION
: Es la región de Google Cloud.
La creación de la instancia y su preparación tardará unos minutos en estar lista para usarse.
Dentro de la instancia creada, crea una base de datos:
Console
- En la página de tu instancia, ve a la pestaña Bases de datos.
- Haga clic en Create database.
- En el diálogo Nombre de la base de datos, ingresa
DATABASE_NAME
. - Haz clic en Crear.
gcloud
Crea la base de datos dentro de la instancia recién creada:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME
Reemplaza
DATABASE_NAME
por un nombre para la base de datos dentro de la instancia.
Crea un usuario de base de datos:
Console
- En la página de tu instancia, ve a la pestaña Usuarios.
- Haz clic en Agregar cuenta de usuario.
- En el cuadro de diálogo Agregar una cuenta de usuario a la instancia en "Autenticación integrada", haz lo siguiente:
- Ingresa el nombre de usuario
DATABASE_USERNAME
. - Ingresa la contraseña
DATABASE_PASSWORD
- Haz clic en Agregar.
gcloud
Crea el usuario en la instancia recién creada:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD
Reemplaza
PASSWORD
por una contraseña segura.
Almacena valores secretos en el Secret Manager
Ahora que los servicios de copia de seguridad están configurados, Django necesita información sobre estos servicios. En lugar de colocar estos valores directamente en el código fuente de Django, en este instructivo, se usa Secret Manager para almacenar esta información de forma segura.
El entorno estándar de App Engine interactúa con los secretos mediante su cuenta de servicio.Cree un archivo de entorno de Django como un secreto del Secret Manager
Almacenarás la configuración necesaria para iniciar Django en un archivo env seguro.
La app de ejemplo usa la API de Secret Manager para recuperar el valor del secreto y el paquete django-environ
para cargar los valores en el entorno de Django. El secreto está configurado para que el entorno estándar
de App Engine pueda acceder a él.
Crea un archivo llamado
.env
y define la cadena de conexión de la base de datos, el nombre del bucket de medios y un nuevo valorSECRET_KEY
:echo DATABASE_URL=postgres://DATABASE_USERNAME:DATABASE_PASSWORD@//cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/DATABASE_NAME > .env echo GS_BUCKET_NAME=PROJECT_ID_MEDIA_BUCKET >> .env echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1) >> .env
Almacena el secreto en Secret Manager:
Console
En la consola de Google Cloud, ve a la página Secret Manager.
Haz clic en Crear Secreto.
En el campo Nombre, ingresa
django_settings
.En el diálogo Valor del secreto, pega el contenido de tu archivo
.env
.Haz clic en Crear secreto.
Borra el archivo local para evitar las anulaciones de la configuración local.
gcloud
Crea un secreto nuevo,
django_settings
, con el valor del archivo.env
:gcloud secrets create django_settings --data-file .env
Para confirmar la creación del secreto, verifícalo:
gcloud secrets describe django_settings gcloud secrets versions access latest --secret django_settings
Borra el archivo local para evitar las anulaciones de la configuración local:
rm .env
Configura el acceso al secreto:
Console
- Haz clic en la pestaña Permisos.
- Haz clic en Agregar.
- En el campo Miembros nuevos, ingresa
PROJECT_ID@appspot.gserviceaccount.com
y, luego, presionaEnter
. - En el menú desplegable Función, selecciona Descriptor de acceso a secretos de Secret Manager.
- Haz clic en Guardar.
gcloud
Otorga acceso al secreto a la cuenta de servicio estándar de App Engine:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Cómo ejecutar la app en una computadora local
Con los servicios de copia de seguridad configurados, puedes ejecutar la app en tu computadora. Esta configuración permite el desarrollo local, la creación de un superusuario y la aplicación de migraciones de bases de datos.
En otra terminal, inicia el proxy de autenticación de Cloud SQL:
Linux/macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAME
Windows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME
En este paso, se establece una conexión entre tu computadora local y tu instancia de Cloud SQL para realizar pruebas locales. Mantén el proxy de autenticación de Cloud SQL en ejecución durante todo el tiempo que realices pruebas locales en la aplicación. Ejecutar este proceso en una terminal separada te permite seguir trabajando mientras se ejecuta este proceso.
En la terminal original, configura el ID del proyecto de forma local (lo usa la API de Secret Manager):
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Windows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID
Establece una variable de entorno para indicar que estás usando el proxy de autenticación de Cloud SQL (este valor se reconoce en el código):
Linux/macOS
export USE_CLOUD_SQL_AUTH_PROXY=true
Windows
set USE_CLOUD_SQL_AUTH_PROXY=true
Ejecuta las migraciones de Django para configurar tus modelos y recursos:
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstatic
Inicia el servidor web de Django:
python manage.py runserver 8080
En tu navegador, ve a http://localhost:8080.
Si está en Cloud Shell, haga clic en el botón Vista previa en la Web y seleccione Vista previa en el puerto 8080.
En la página, se muestra el siguiente texto: “Hello, world. You're at the polls index”. El servidor web de Django que se ejecuta en tu computadora proporciona las páginas de la app de muestra.
Presiona
Ctrl
/Cmd
+C
para detener el servidor web local.
Usar la Consola del administrador de Django
Para acceder a la consola del administrador de Django, debes crear un superusuario. Dado que tienes una conexión con acceso local a la base de datos, puedes ejecutar comandos de administración:
Crea un superusuario. Se te pedirá que ingreses un nombre de usuario, un correo electrónico y una contraseña.
python manage.py createsuperuser
Inicia un servidor web local:
python manage.py runserver
En tu navegador, ve a http://localhost:8000/admin.
Accede al sitio del administrador con el nombre de usuario y la contraseña que usaste cuando ejecutaste
createsuperuser
.
Implementar la app en el entorno estándar de App Engine
Con todos los servicios de copia de seguridad configurados y la aplicación probada de forma local, puedes implementar la aplicación en el entorno estándar de App Engine:
- Para subir la app, ejecuta el siguiente comando, que implementa la app como se describe en
app.yaml
y establece la versión recién implementada como la versión predeterminada, lo que hace que entregue todo el tráfico nuevo:gcloud app deploy
- Para confirmar la configuración, escribe "yes" cuando se te solicite.
- Espera a que aparezca el mensaje que informa que la actualización se completó.
- Abre
app.yaml
y actualiza el valor deAPPENGINE_URL
con la URL implementada:... env_variables: APPENGINE_URL: https://PROJECT_ID.uc.r.appspot.com
- Sube los cambios de la configuración:
gcloud app deploy
Ejecuta la app implementada
Se implementó la app y ahora es posible acceder a ella:
Abre el sitio web implementado:
gcloud app browse
Como alternativa, puedes mostrar la URL y abrirla manualmente:
gcloud app describe --format "value(defaultHostname)"
Un servidor web que se ejecuta en el entorno estándar de App Engine entrega tu solicitud.
Actualizar la aplicación
Para actualizar tu aplicación, realiza cambios en el código y, luego, vuelve a ejecutar el comando gcloud app deploy
.
La implementación nueva crea una versión nueva de tu app y la convierte en la versión predeterminada. Se conservarán las versiones anteriores de la app. Todas estas versiones de la app son recursos facturables. Para reducir los costos, borra las versiones no predeterminadas de tu app.
Configuración para producción
Ahora la implementación de Django funciona, pero puedes seguir otros pasos para asegurarte de que tu aplicación esté lista para la producción.
Cómo inhabilitar la depuración
Confirma que la variable DEBUG
en mysite/settings.py
esté configurada como False
. Esto evitará que se muestren páginas de error detalladas al usuario, lo que puede filtrar información sobre la configuración.
Limita los privilegios de usuario de la base de datos
Cualquier usuario que se crea mediante Cloud SQL tiene los privilegios asociados con la función cloudsqlsuperuser
: CREATEROLE
, CREATEDB
y LOGIN
.
Para evitar que el usuario de la base de datos Django tenga estos permisos, crea el usuario manualmente en PostgreSQL. Deberás tener instalada la terminal interactiva psql
o usar Cloud Shell, que tiene esta herramienta preinstalada.
Console
-
En la consola de Google Cloud, activa Cloud Shell.
En Cloud Shell, usa la terminal integrada para conectarte a la instancia
INSTANCE_NAME
:gcloud sql connect INSTANCE_NAME --user postgres
Ingresa la contraseña de usuario de postgres.
Ahora estás usando
psql
. Deberías ver el mensajepostgres=>
.Crear un usuario
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
Reemplaza
PASSWORD
por una contraseña aleatoria y única.Otorga todos los derechos sobre la base de datos nueva al usuario nuevo:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
Salga de
psql
:\q
gcloud
Inicia una conexión a la instancia de SQL:
gcloud sql connect INSTANCE_NAME --user postgres
Reemplaza
INSTANCE_NAME
por la instancia de Cloud SQL creada.Ingresa la contraseña de usuario de postgres.
Ahora estás usando
psql
. Deberías ver el mensajepostgres=>
.Crear un usuario
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
Otorga todos los derechos sobre la base de datos nueva al usuario nuevo:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
Salga de
psql
:\q
Examine el código
Aplicación de muestra
La app de muestra de Django se creó con las herramientas estándar de Django. Con los siguientes comandos, se crea el proyecto y la app de encuestas:
django-admin startproject mysite
python manage.py startapp polls
Las vistas base, los modelos y la configuración de ruta se copiaron de Escribe tu primera app de Django (Parte 1 y Parte 2).
Secretos del Secret Manager
El archivo settings.py
contiene código que usa la API de Python de Secret Manager para recuperar la versión más reciente del secreto con nombre y extraerla al entorno (mediante django-environ
):
El Secret se usa para almacenar varios valores de Secret y reducir la cantidad de Secrets diferentes que deben configurarse.
Configuraciones de CSRF
Django tiene protección integrada contra la falsificación de solicitudes entre sitios (CSRF). A partir de Django 4.0, los cambios en el funcionamiento implican que es importante indicarle a Django cuál es su URL alojada para que pueda ofrecer las mejores protecciones para los usuarios que envían datos.
Proporciona la URL de la app como una variable de entorno en el archivo settings.py
. Este es el valor que Django usa para la configuración relevante.
Anulaciones de secretos locales
Si se encuentra un archivo .env
en el sistema de archivos local, se usa en lugar del valor de Secret Manager. Crear un archivo .env
de forma local puede ayudar con las pruebas locales (p.ej., desarrollo local en una base de datos SQLite u otra configuración local).
Conexión a base de datos
El archivo settings.py
contiene la configuración de tu base de datos de SQL: Usa el ayudante env.db()
de django-environ
para cargar la cadena de conexión establecida en DATABASE_URL
en la configuración DATABASES
.
Cuando ejecutas la aplicación de forma local y usas el proxy de autenticación de Cloud SQL para acceder a la base de datos alojada, la marca USE_CLOUD_SQL_AUTH_PROXY
ajusta la configuración de la base de datos para usar el proxy.
Contenido estático alojado
El archivo app.yaml
contiene información de configuración para la implementación en App Engine.
Este archivo app.yaml
especifica que App Engine entrega archivos estáticos desde el directorio static/
:
Cuando ejecutas la app de manera local con DEBUG
habilitado, Django entrega estos archivos de manera local:
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
- En la consola de Google Cloud, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
¿Qué sigue?
- Aprende a configurar PostgreSQL para producción
- Obtén más información sobre Django en Google Cloud