在 App Engine 柔性环境中运行 Django

App Engine 柔性环境上运行的 Django 应用基于支持所有 Google 产品的同一基础架构,通常可获得更好的可扩缩性。

本教程假定您熟悉 Django 网络开发。如果您刚开始接触 Django 开发,最好先查看编写您的第一个 Django 应用,然后再继续操作。在本教程中,应用的模型代表包含问题的意见调查,您可以使用 Django 管理控制台与模型进行互动。

本教程需要使用 Python 3.7 或更高版本

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Cloud SQL Admin API。

    启用 API

  5. 安装并初始化 Cloud SDK

登录 gcloud

获取新凭据以使用 Cloud SQL Admin API:

gcloud auth application-default login

下载并运行应用

满足前提条件的要求后,下载并部署 Django 示例应用。以下部分将引导您配置、运行和部署应用。

克隆 Django 应用

Django 示例应用的代码位于 GitHub 上的 GoogleCloudPlatform/python-docs-samples 代码库中。

  1. 您可以下载该示例的 ZIP 文件并将其解压缩,或将代码库克隆到本地机器:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

  2. 转到包含示例代码的目录:

Linux/macOS

  cd python-docs-samples/appengine/standard_python3/django

Windows

  cd python-docs-samples\appengine\standard_python3\django

设置本地环境

部署后,您的应用会使用 App Engine 环境中内置的 Cloud SQL 代理与 Cloud SQL 实例进行通信。但要在本地测试应用,您必须在开发环境中安装和使用该代理的本地副本。

详细了解 Cloud SQL 代理

要在 Cloud SQL 实例上执行基本管理任务,您可以使用 PostgreSQL 客户端。

安装 Cloud SQL 代理

下载并安装 Cloud SQL 代理。在本地运行时,Cloud SQL 代理接到您的 Cloud SQL 实例。

Linux 64 位

  1. 下载该代理:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. 使该代理可以执行:
    chmod +x cloud_sql_proxy
    

Linux 32 位

  1. 下载该代理:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. 使该代理可以执行:
    chmod +x cloud_sql_proxy
    

macOS 64 位

  1. 下载该代理:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. 使该代理可以执行:
    chmod +x cloud_sql_proxy
    

macOS 32 位

  1. 下载该代理:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. 使该代理可以执行:
    chmod +x cloud_sql_proxy
    

Windows 64 位

右键点击 https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe,然后选择链接另存为以下载该代理。将文件重命名为 cloud_sql_proxy.exe

Windows 32 位

右键点击 https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe,然后选择链接另存为以下载该代理。将文件重命名为 cloud_sql_proxy.exe

Docker 代理映像

为方便起见,Cloud SQL 团队维护多个包含 Cloud SQL 代理的容器映像,以供客户使用。如需详细了解这些映像,请参阅 GitHub 上的 Cloud SQL 代理代码库。您可以通过 Docker 使用以下命令将最新映像拉取到本地机器:
docker pull gcr.io/cloudsql-docker/gce-proxy:1.19.1

其他操作系统

对于此处未列出的其他操作系统,您可以通过源代码编译代理

创建 Cloud SQL 实例

  1. <a{: class="internal" l10n-attrs-original-order="href,track-type,track-name,track-metadata-position,track-metadata-end-goal,class,target" l10n-encrypted-href="lsL4NbV5FI0DRuRANJcTZKJysOQGKX761P3ItELRG1PjHEtGnUIGGfDSUdzN6k/z" target="_blank" track-metadata-end-goal="createInstance" track-metadata-position="body" track-name="internalLink" track-type="python" }=""> Create a Cloud SQL for PostgreSQL instance.

    将该实例命名为 polls-instance 或类似名称。该实例可能需要几分钟才能准备就绪。实例准备就绪后,即会显示在实例列表中。

    </a{:>
  2. 使用 Cloud SDK 运行以下命令,其中 [YOUR_INSTANCE_NAME] 表示 Cloud SQL 实例的名称:
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    记下输出内容中显示的 [CONNECTION_NAME] 的值。

    [CONNECTION_NAME] 值的格式为 [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME]

初始化您的 Cloud SQL 实例

  1. 使用上一步中的 [CONNECTION_NAME] 值启动 Cloud SQL 代理:

    Linux/macOS

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:5432

    Windows

    cloud_sql_proxy.exe -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:5432

    [YOUR_INSTANCE_CONNECTION_NAME] 替换为您在上一步中记录的 [CONNECTION_NAME] 值。

    此步骤会建立从本地计算机到 Cloud SQL 实例的连接,以进行本地测试。在您对应用进行本地测试的整个过程中,请确保 Cloud SQL 代理一直运行。

  2. 创建一个 Cloud SQL 用户和一个数据库:

    Cloud Console

    1. 使用 Cloud Console 为您的 Cloud SQL 实例 polls-instance 创建一个新数据库。例如,您可以使用 polls 这个名称。
    2. 使用 Cloud Console 为您的 Cloud SQL 实例 polls-instance 创建一个新用户。

    Postgres 客户端

    1. 在一个单独的命令行标签页中,安装 Postgres 客户端
      sudo apt-get install postgresql
    2. 使用该 Postgres 客户端或类似程序连接到您的实例。收到提示时,使用您配置的 root 密码。
      psql --host 127.0.0.1 --user postgres --password
    3. 使用以下命令,在 Cloud SQL 数据库中创建所需的数据库、用户和访问权限。将 [POSTGRES_USER][POSTGRES_PASSWORD] 替换为您要使用的用户名和密码。
      CREATE DATABASE polls;
      CREATE USER [POSTGRES_USER] WITH PASSWORD '[POSTGRES_PASSWORD]';
      GRANT ALL PRIVILEGES ON DATABASE polls TO [POSTGRES_USER];
      GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [POSTGRES_USER];
      

配置数据库设置

  1. 打开 mysite/settings.py 进行修改。

    1. 要使用 MySQL 而不是 PostgreSQL,请执行以下操作:

      1. 按照文件注释中的说明启用 MySQL 数据库驱动程序。
      2. 打开 requirements.txt 进行修改,然后按照说明将 MySQL 数据库驱动程序添加到依赖项中。
    2. 要帮助为 App Engine 部署和本地测试设置与数据库的连接,请将 <your-database-user><your-database-password> 设置为您之前在创建 Cloud SQL 实例步骤中创建的用户名和密码

    3. 获取您的实例的值:

      gcloud sql instances describe [YOUR_INSTANCE_NAME]
      
    4. 从输出中复制 connectionName 值以在下一步中使用。

    5. <your-cloudsql-connection-string> 设置为上一步中的 connectionName

  2. 关闭并保存 settings.py

在本地计算机上运行应用

  1. 要在本地计算机上运行 Django 应用,请设置 Python 开发环境,其中包括 Python、pipvirtualenv

  2. 创建一个独立的 Python 环境,并安装依赖项:

    Linux/macOS

    virtualenv env
    source env/bin/activate
    pip install -r requirements.txt
    

    Windows

    virtualenv env
    env\scripts\activate
    pip install -r requirements.txt
    

  3. 运行 Django 迁移命令来设置模型:

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    
  4. 启动本地网络服务器:

    python manage.py runserver
    
  5. 在浏览器中,转到 http://localhost:8000

    http://localhost:8000
    

    该页面将显示以下文本:“Hello, world. You're at the polls index."。您的计算机上运行的 Django 网络服务器会提供示例应用页面。

  6. Control+C 停止本地网络服务器。

使用 Django 管理控制台

  1. 创建超级用户。您需要定义用户名和密码。

    python manage.py createsuperuser
    
  2. 启动本地网络服务器:

    python manage.py runserver
    
  3. 在浏览器中,转到 http://localhost:8000/admin

    http://localhost:8000/admin
    
  4. 使用您在运行 createsuperuser 时使用的用户名和密码登录管理站点。

将应用部署到 App Engine 柔性环境

将应用部署到 Google Cloud 后,应用会使用 Gunicorn 服务器。Gunicorn 服务器不提供静态内容,因此应用将使用 Cloud Storage 来提供静态内容。

  1. 创建 Cloud Storage 存储分区,请运行以下命令:

    1. 创建 Cloud Storage 存储分区并将其配置为可公开读取。 将 <your-gcs-bucket> 替换为您选择的存储分区名称。例如,您可以将存储分区命名为项目 ID。

      gsutil mb gs://<your-gcs-bucket>
      gsutil defacl set public-read gs://<your-gcs-bucket>
      
    2. 将所有静态内容收集到一个本地文件夹中:

      python manage.py collectstatic
      
    3. 将静态内容上传到 Cloud Storage:

      gsutil rsync -R static/ gs://<your-gcs-bucket>/static
      
  2. 修改 settings.py:

    1. 打开 mysite/settings.py 进行修改。

    2. STATIC_URL 的值设置为以下网址。将 <your-gcs-bucket> 替换为您之前创建的存储分区名称。

      https://storage.googleapis.com/<your-gcs-bucket>/static/
      
    3. 关闭并保存 settings.py

  3. 修改 app.yaml:

    1. 打开 app.yaml 进行修改。

    2. 从命令行运行以下命令:

      gcloud sql instances describe [YOUR_INSTANCE_NAME]
      
    3. 从输出中复制 connectionName 值以在下一步中使用。

    4. <your-cloudsql-connection-string> 替换为上一步中的 connectionName

    5. 关闭并保存 app.yaml

  4. 部署该示例:

    gcloud app deploy
    

    等待更新已完成的通知消息。

看到应用在 Google Cloud 中运行

以下命令按照 app.yaml 中的说明部署应用,并将新部署的版本设置为默认版本,从而使其能够为所有新流量提供服务。

您的请求由在 App Engine 柔性环境中运行的网络服务器来进行处理。

在应用部署时,您可能会在平台检查应用是否提供服务时看到多条重复消息。这很正常。等待应用更新已完成的通知消息。

如果您要更新应用,则只需输入您在部署应用时使用的命令,即可部署更新后的版本。该部署会创建应用的新版本并将其提升为默认版本。应用的旧版本仍会保留,与其关联的虚拟机 (VM) 实例也是一样。所有这些应用版本和虚拟机实例都属于可计费资源。要减少费用,请删除应用的非默认版本。

如需了解如何删除应用的非默认版本或停止虚拟机实例,请参阅清理

生产

当您准备好在生产环境中传送内容时,请在 mysite/settings.py 中将 DEBUG 变量更改为 False

了解代码

Django 示例应用使用标准 Django 工具创建。

  • 以下命令将创建项目及意见调查应用:

    django-admin startproject mysite
    
    python manage.py startapp polls
    
  • settings.py 文件包含 SQL 数据库的配置:

    DATABASES = {
        'default': {
            # If you are using Cloud SQL for MySQL rather than PostgreSQL, set
            # 'ENGINE': 'django.db.backends.mysql' instead of the following.
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'polls',
            'USER': '<your-database-user>',
            'PASSWORD': '<your-database-password>',
            # For MySQL, set 'PORT': '3306' instead of the following. Any Cloud
            # SQL Proxy instances running locally must also be set to tcp:3306.
            'PORT': '5432',
        }
    }
    # In the flexible environment, you connect to CloudSQL using a unix socket.
    # Locally, you can use the CloudSQL proxy to proxy a localhost connection
    # to the instance
    DATABASES['default']['HOST'] = '/cloudsql/<your-cloudsql-connection-string>'
    if os.getenv('GAE_INSTANCE'):
        pass
    else:
        DATABASES['default']['HOST'] = '127.0.0.1'
  • 要指定应用如何传送静态内容,请在 settings.py 文件中设置 STATIC_URL 的值:

    # Fill in your cloud bucket and switch which one of the following 2 lines
    # is commented to serve static content from GCS
    # STATIC_URL = 'https://storage.googleapis.com/<your-gcs-bucket>/static/'
    STATIC_URL = '/static/'
  • app.yaml 文件包含用于部署到柔性环境的配置信息:

    runtime: python
    env: flex
    entrypoint: gunicorn -b :$PORT mysite.wsgi
    
    beta_settings:
        cloud_sql_instances: <your-cloudsql-connection-string>
    
    runtime_config:
      python_version: 3