Ejecuta Django en el entorno estándar de App Engine


Las apps de Django que se ejecutan en el entorno estándar de App Engine escalan de manera dinámica en función del tráfico.

En este instructivo, se supone que estás familiarizado con el desarrollo web con Django. Si es la primera vez que desarrollas con Django, es recomendable 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 admite 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 secretos 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. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 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 ejemplo de Django está en el repositorio GoogleCloudPlatform/python-docs-samples en GitHub.

  1. Puedes descargar la muestra. como un archivo ZIP y extráelo o clona el repositorio en tu máquina local:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. 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 utiliza Python para ejecutar la aplicación de ejemplo en tu máquina. El código de muestra también requiere la instalación de dependencias.

Para obtener más detalles, consulta la guía del entorno de desarrollo de Python.

  1. Confirma que tu Python tenga al menos la versión 3.8.

     python -V
    

    Deberías ver Python 3.8.0 o una versión posterior.

  2. 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 Cloud SQL Auth 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 entorno estándar de App Engine para comunicarte con tu Cloud SQL instancia. 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.

  1. Autentica y adquiere credenciales para la API:

    gcloud auth application-default login
    
  2. Descarga y, luego, instala el proxy de autenticación de Cloud SQL en tu máquina local.

    Linux de 64 bits

    1. 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.13.0/cloud-sql-proxy.linux.amd64
    2. Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
      chmod +x cloud-sql-proxy

    Linux de 32 bits

    1. 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.13.0/cloud-sql-proxy.linux.386
    2. Si no se encuentra el comando curl, ejecuta sudo apt install curl y repite el comando de descarga.
    3. Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
      chmod +x cloud-sql-proxy

    macOS de 64 bits

    1. 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.13.0/cloud-sql-proxy.darwin.amd64
    2. Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
      chmod +x cloud-sql-proxy

    Mac M1

    1. 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.13.0/cloud-sql-proxy.darwin.arm64
        
    2. 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.13.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 por cloud-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.13.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 por cloud-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 y buster. La imagen de contenedor del proxy de autenticación de Cloud SQL predeterminada usa distroless, que no contiene shell. Si necesitas una shell o herramientas relacionadas, descarga una imagen basada en alpine o buster. 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.13.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 mover la descarga a un lugar común, como una ubicación en tu PATH o tu directorio principal. Si decides hacerlo, 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 cloud-sql-proxy.

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 admiten el proyecto de Django implementado. Estos servicios se implementan en una región específica. Para lograr la eficiencia entre los servicios, todos deben implementarse en la misma región. Para obtener más información sobre la región más cercana, consulte Productos disponibles por región.

En este instructivo, se usan los mecanismos integrados de hosting de recursos estáticos en App Engine estándar.

Configura una instancia de Cloud SQL para PostgreSQL

Django admite oficialmente múltiples bases de datos relacionales, pero ofrece con PostgreSQL. Cloud SQL admite PostgreSQL, 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, una base de datos y un usuario de base de datos de PostgreSQL para la app.

  1. Crea la instancia de PostgreSQL:

    Console

    1. En la consola de Google Cloud, ve a la página Instancias de Cloud SQL.

      Ir a la página Instancias de Cloud SQL

    2. Haga clic en Crear instancia.

    3. Haz clic en PostgreSQL.

    4. En el campo ID de instancia, ingresa INSTANCE_NAME.

    5. Ingresa una contraseña para el usuario de postgres.

    6. Mantén los valores predeterminados en los otros campos.

    7. Haga clic en Crear.

    La instancia demora unos minutos en crearse y estar lista para su uso.

    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 Cloud
    • REGION: Es la región de Google Cloud.

    La creación de la instancia y su uso se demora unos minutos.

  2. Dentro de la instancia creada, crea una base de datos:

    Console

    1. En la página de tu instancia, ve a la pestaña Bases de datos.
    2. Haga clic en Create database.
    3. En el diálogo Nombre de la base de datos, ingresa DATABASE_NAME.
    4. Haga 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.

  3. Crea un usuario de base de datos:

    Console

    1. En la página de tu instancia, ve a la pestaña Usuarios.
    2. Haz clic en Agregar cuenta de usuario.
    3. En el cuadro de diálogo Agregar una cuenta de usuario a la instancia en "Autenticación integrada", haz lo siguiente:
    4. Ingresa el nombre de usuario DATABASE_USERNAME.
    5. Ingresa la contraseña DATABASE_PASSWORD
    6. Haga clic en Agregar.

    gcloud

    • Crea el usuario dentro de la instancia creada recientemente:

      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 Secrets a través de sus cuenta de servicio.

Cree un archivo de entorno de Django como un secreto del Secret Manager

Almacenas 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 Secret. valor y django-environ para cargar los valores en el entorno de Django. Se configura el Secret sean accesibles para el entorno estándar de App Engine.

  1. 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 valor SECRET_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
    
  2. Almacena el secreto en Secret Manager:

    Console

    1. En la consola de Google Cloud, ve a la página Secret Manager.

      Ir a la página de Secret Manager

    2. Haz clic en Crear Secreto.

    3. En el campo Nombre, ingresa django_settings.

    4. En el diálogo Valor del secreto, pega el contenido de tu archivo .env.

    5. Haz clic en Crear secreto.

    6. Borra el archivo local para evitar anulaciones de la configuración local.

    gcloud

    1. Crea un secreto nuevo, django_settings, con el valor del archivo .env:

      gcloud secrets create django_settings --data-file .env
      
    2. Para confirmar la creación del secreto, verifica lo siguiente:

      gcloud secrets describe django_settings
      
      gcloud secrets versions access latest --secret django_settings
      
    3. Borra el archivo local para evitar anulaciones de la configuración local:

      rm .env
      
  3. Configura el acceso al secreto:

    Console

    1. Haz clic en la pestaña Permisos.
    2. Haga clic en Agregar.
    3. En el campo Nuevos miembros, ingresa PROJECT_ID@appspot.gserviceaccount.com y, luego, presiona Enter.
    4. En el menú desplegable Función, selecciona Descriptor de acceso a secretos de Secret Manager.
    5. Haz clic en Guardar.

    gcloud

    1. 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 resguardo configurados, ahora 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.

  1. En una terminal separada, 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 la El proxy de autenticación de Cloud SQL se ejecuta todo el tiempo que pruebas tu aplicación de manera local. Ejecutar este proceso en una terminal independiente te permite seguir trabajando mientras se ejecuta.

  2. En la terminal original, configura el ID del proyecto de forma local (que usa la API de Secret Manager):

    Linux/macOS

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
    

    Windows

    set GOOGLE_CLOUD_PROJECT=PROJECT_ID
    
  3. Establece una variable de entorno para indicar que usas 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
    
  4. Ejecuta las migraciones de Django para configurar tus modelos y elementos:

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    python manage.py collectstatic
    
  5. Inicia el servidor web de Django:

    python manage.py runserver 8080
    
  6. En tu navegador, ve a http://localhost:8080.

    Si estás en Cloud Shell, haz clic en el botón Vista previa en la Web y selecciona 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.

  7. Presiona Ctrl/Cmd+C para detener el servidor web local.

Usar la Consola del administrador de Django

Para acceder a la consola de administración de Django, debes crear un superusuario. Dado que tienes una conexión a la que se puede acceder de manera local a la base de datos, puedes ejecutar comandos de administración:

  1. Crea un superusuario. Se te pedirá que ingreses un nombre de usuario, un correo electrónico y una contraseña.

    python manage.py createsuperuser
    
  2. Inicia un servidor web local:

    python manage.py runserver
    
  3. En tu navegador, ve a http://localhost:8000/admin.

  4. 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 localmente, ahora puedes implementar la app en el entorno estándar de App Engine:

  1. Para subir la app, ejecuta el siguiente comando, que la implementa como se describe en app.yaml y establece la versión recién implementada como la versión predeterminada, lo que hace que se entregue todo el tráfico nuevo:
    gcloud app deploy
  2. Escribe "yes" para confirmar la configuración. cuando se te solicite.
  3. Espera a que aparezca el mensaje que informa que la actualización se completó.
  4. Abre app.yaml y actualiza el valor de APPENGINE_URL con la URL implementada:
    ...
    env_variables:
        APPENGINE_URL: https://PROJECT_ID.uc.r.appspot.com
    
  5. Sube los cambios de la configuración:
    gcloud app deploy

Ejecuta la app implementada

Se implementó la app y ahora se puede acceder a ella:

  • Abre el sitio web implementado:

    gcloud app browse
    
  • También 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.

El objeto Deployment crea versión nueva de tu app y la promueve a la versión predeterminada. Se conservan las versiones anteriores de la app. Todas estas versiones de la app son recursos facturables. Para reducir costos, borrar las versiones no predeterminadas de tu app.

Configuración para producción

Ahora tienes una implementación de Django en funcionamiento, pero hay más pasos que puedes seguir para asegurarte de que tu aplicación esté lista para la producción.

Inhabilita 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 las configuraciones.

Limita los privilegios del usuario de la base de datos

Cualquier usuario que se cree con Cloud SQL tiene los privilegios asociados al rol cloudsqlsuperuser: CREATEROLE, CREATEDB y LOGIN.

Para evitar que el usuario de la base de datos de Django tenga estos permisos, crea el usuario de forma manual en PostgreSQL. Deberás tener instalada la terminal interactiva psql o usar Cloud Shell, que tiene esta herramienta preinstalada.

Console

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. En Cloud Shell, usa la terminal integrada para conectarte a tu instancia de INSTANCE_NAME:

    gcloud sql connect INSTANCE_NAME --user postgres
    
  3. Ingresa la contraseña del usuario de postgres.

    Ahora estás usando psql. Deberías ver el mensaje postgres=>.

  4. Crear un usuario

    CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
    

    Reemplaza PASSWORD por una contraseña única y aleatoria.

  5. Otorga todos los derechos sobre la base de datos nueva al usuario nuevo:

    GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
    
  6. Salga de psql:

    \q
    

gcloud

  1. 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 que se creó.

  2. Ingresa la contraseña del usuario de postgres.

    Ahora estás usando psql. Deberías ver el mensaje postgres=>.

  3. Crear un usuario

    CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
    
  4. Otorga todos los derechos sobre la base de datos nueva al usuario nuevo:

    GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
    
  5. 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 básicas, los modelos y las configuraciones de ruta se copiaron de Escribe tu primera app de Django (Parte 1 y la 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 transferirlo al entorno (con django-environ):

env = environ.Env(DEBUG=(bool, False))
env_file = os.path.join(BASE_DIR, ".env")

if os.path.isfile(env_file):
    # Use a local secret file, if provided

    env.read_env(env_file)
# ...
elif os.environ.get("GOOGLE_CLOUD_PROJECT", None):
    # Pull secrets from Secret Manager
    project_id = os.environ.get("GOOGLE_CLOUD_PROJECT")

    client = secretmanager.SecretManagerServiceClient()
    settings_name = os.environ.get("SETTINGS_NAME", "django_settings")
    name = f"projects/{project_id}/secrets/{settings_name}/versions/latest"
    payload = client.access_secret_version(name=name).payload.data.decode("UTF-8")

    env.read_env(io.StringIO(payload))
else:
    raise Exception("No local .env or GOOGLE_CLOUD_PROJECT detected. No secrets found.")

El Secret se usa para almacenar varios valores de Secrets y, así, reducir la cantidad de Secrets diferentes que se deben configurar.

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 la forma en que funciona esto significan que es importante decirle a Django cuál es su URL alojada, por lo que puede ofrecer la mejor protección a los usuarios que envían datos.

Proporcionas 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.

# SECURITY WARNING: It's recommended that you use this when
# running in production. The URL will be known once you first deploy
# to App Engine. This code takes the URL and converts it to both these settings formats.
APPENGINE_URL = env("APPENGINE_URL", default=None)
if APPENGINE_URL:
    # Ensure a scheme is present in the URL before it's processed.
    if not urlparse(APPENGINE_URL).scheme:
        APPENGINE_URL = f"https://{APPENGINE_URL}"

    ALLOWED_HOSTS = [urlparse(APPENGINE_URL).netloc]
    CSRF_TRUSTED_ORIGINS = [APPENGINE_URL]
    SECURE_SSL_REDIRECT = True
else:
    ALLOWED_HOSTS = ["*"]

Anulaciones de Secrets locales

Si se encuentra un archivo .env en el sistema de archivos local, se usa en lugar del valor de Secret Manager. La creación local de un archivo .env puede ayudar con las pruebas locales (p.ej., el desarrollo local en una base de datos SQLite o alguna 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 ejecutes la aplicación de manera local y uses el proxy de autenticación de Cloud SQL para acceder a base de datos alojada, la marca USE_CLOUD_SQL_AUTH_PROXY ajusta la base de datos para usar el proxy.

# Use django-environ to parse the connection string
DATABASES = {"default": env.db()}

# If the flag as been set, configure to use proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

Contenido estático alojado

El app.yaml contiene la 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/:

runtime: python39

env_variables:
  # This setting is used in settings.py to configure your ALLOWED_HOSTS
  # APPENGINE_URL: PROJECT_ID.uc.r.appspot.com

handlers:
# This configures Google App Engine to serve the files in the app's static
# directory.
- url: /static
  static_dir: static/

# This handler routes all requests not caught above to your main app. It is
# required when static routes are defined, but can be omitted (along with
# the entire handlers section) when there are no static files defined.
- url: /.*
  script: auto

Cuando se ejecuta la app de manera local con DEBUG habilitado, Django entrega estos archivos de forma local:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("", include("polls.urls")),
    path("admin/", admin.site.urls),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

¿Qué sigue?