像 Django 一样将有状态应用部署到 Cloud Run 需要集成服务以相互交互以形成一个具有结合性的项目。
本教程假定您熟悉 Django 网络开发。如果您不熟悉 Django 开发,最好先编写您的第一个 Django 应用,然后再继续。
虽然本教程专门介绍了 Django,但您可以将此部署过程与其他基于 Django 的框架(如 Wagtail 和 Django CMS)结合使用。
本教程使用 Django 4,它至少需要 Python 3.8。
目标
在本教程中,您将学习以下操作:
- 创建并连接 Cloud SQL 数据库。
- 创建和使用 Secret Manager Secret 值。
将 Django 应用部署到 Cloud Run。
在 Cloud Storage 上托管静态文件。
使用 Cloud Build 自动执行部署。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
开始前须知
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 确保本教程使用的帐号拥有足够的权限。
准备环境
克隆示例应用
Django 示例应用的代码位于 GitHub 上的 GoogleCloudPlatform/python-docs-samples 代码库中。
您可以下载该示例的 ZIP 文件并将其解压缩,也可以将该代码库克隆到本地机器:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
转到包含示例代码的目录:
Linux/macOS
cd python-docs-samples/run/django
Windows
cd python-docs-samples\run\django
确认 Python 设置
本教程依赖 Python 在机器上运行示例应用。示例代码还需要安装依赖项
如需了解详情,请参阅 Python 开发环境指南。
确认您的 Python 版本至少为 3.7。
python -V
您应该会看到
Python 3.7.3
或更高。创建 Python 虚拟环境并安装依赖项:
Linux/macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
Windows
python -m venv env venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
下载 Cloud SQL Auth 代理以从本地机器连接到 Cloud SQL
部署后,您的应用使用 Cloud Run 环境中内置的 Cloud SQL Auth 代理与 Cloud SQL 实例进行通信。但是,如需在本地测试应用,您必须在开发环境中安装和使用代理的本地副本。如需了解详情,请参阅 Cloud SQL Auth 代理指南。
Cloud SQL Auth 代理使用 Cloud SQL API 与 SQL 实例进行交互。为此,它需要通过 gcloud 进行应用身份验证。
对 API 进行身份验证并获取凭据:
gcloud auth application-default login
将 Cloud SQL Auth 代理下载并安装到本地机器。
Linux 64 位
- 下载 Cloud SQL Auth 代理:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
- 使 Cloud SQL Auth 代理可执行:
chmod +x cloud_sql_proxy
Linux 32 位
- 下载 Cloud SQL Auth 代理:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
- 如果找不到
wget
命令,请运行sudo apt-get install wget
并重复下载命令。 - 使 Cloud SQL Auth 代理可执行:
chmod +x cloud_sql_proxy
macOS 64 位
- 下载 Cloud SQL Auth 代理:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
- 使 Cloud SQL Auth 代理可执行:
chmod +x cloud_sql_proxy
macOS 32 位
- 下载 Cloud SQL Auth 代理:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
- 使 Cloud SQL Auth 代理可执行:
chmod +x cloud_sql_proxy
Mac M1
- 下载 Cloud SQL Auth 代理:
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.arm64
- 使 Cloud SQL Auth 代理可执行:
chmod +x cloud_sql_proxy
Windows 64 位
右键点击 https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe,然后选择链接另存为以下载 Cloud SQL 身份验证代理。将文件重命名为cloud_sql_proxy.exe
。Windows 32 位
右键点击 https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe,然后选择链接另存为以下载 Cloud SQL 身份验证代理。将文件重命名为cloud_sql_proxy.exe
。Cloud SQL Auth 代理 Docker 映像
为方便起见,您可以在 GitHub 的 Cloud SQL Auth 代理代码库中找到多个包含 Cloud SQL Auth 代理的容器映像。您可以使用 Docker 使用以下命令将最新映像拉取到本地机器:docker pull gcr.io/cloudsql-docker/gce-proxy:1.19.1
其他操作系统
对于此处未列出的其他操作系统,您可以从源代码编译 Cloud SQL Auth 代理。您可以选择将下载内容移到常用位置,例如
PATH
上的某个位置或主目录。如果您选择执行此操作,那么当您在本教程后面部分启动 Cloud SQL Auth 代理时,请务必在使用cloud_sql_proxy
命令时引用您选择的位置。- 下载 Cloud SQL Auth 代理:
创建后备服务
本教程使用多种 Google Cloud 服务来提供支持已部署 Django 项目的数据库、媒体存储空间和密文存储空间。这些服务部署在特定地区中。为了提高服务之间的效率,所有服务都应部署在同一地区。如需详细了解离您最近的地区,请参阅各地区提供的商品。
本教程使用 Cloud Run 中的集成式静态资源托管机制。设置 Cloud SQL for PostgreSQL 实例
Django 正式支持多个关系型数据库,但提供了 PostgreSQL 的最大支持。Cloud SQL 支持 PostgreSQL,因此本教程选择使用该类型的数据库。
以下部分介绍如何为应用创建 PostgreSQL 实例、数据库和数据库用户。
创建 PostgreSQL 实例:
控制台
在 Cloud Console 中,转到 Cloud SQL 实例页面。
点击创建实例。
点击 PostgreSQL。
在实例 ID 字段中,输入
INSTANCE_NAME
。为 postgres 用户输入密码。
其他字段保留默认值。
点击创建。
创建实例并准备就绪可供使用需要几分钟时间。
gcloud
创建 PostgreSQL 实例:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_13 \ --tier db-f1-micro \ --region REGION
替换以下内容:
INSTANCE_NAME
:Cloud SQL 实例名称PROJECT_ID
:Google Cloud 项目 IDREGION
:Google Cloud 地区
创建实例并准备就绪可供使用需要几分钟时间。
在已创建的实例中,创建一个数据库:
控制台
- 在实例页面中,转到数据库标签页。
- 点击创建数据库。
- 在数据库名称对话框中,输入
DATABASE_NAME
。 - 点击创建。
gcloud
在最近创建的实例中创建数据库:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME
将
DATABASE_NAME
替换为实例中数据库的名称。
创建数据库用户:
控制台
- 在实例页面中,转到用户标签页。
- 点击添加用户帐号。
- 在将用户帐号添加到实例对话框的“内置身份验证”下:
- 输入用户名
DATABASE_USERNAME
。 - 输入密码
DATABASE_PASSWORD
- 点击添加。
gcloud
在最近创建的实例中创建用户:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD
将
PASSWORD
替换为安全密码。
设置 Cloud Storage 存储分区
您可以使用 Cloud Storage 将包含 Django 的静态资源以及用户上传的媒体存储在可用性较高的对象存储中。django-storages[google]
软件包会处理 Django 与此存储后端的交互。
控制台
gcloud
在安装 gcloud
CLI 的过程中,安装了 gsutil
命令行工具。
创建 Cloud Storage 存储分区:
gsutil mb -l REGION gs://PROJECT_ID_MEDIA_BUCKET
将
MEDIA_BUCKET
替换为媒体存储分区的后缀。结合项目 ID,这将创建一个唯一的存储分区名称。
在 Secret Manager 中存储密文值
在配置后备服务后,Django 需要有关这些服务的信息。本教程使用 Secret Manager 安全地存储这些信息,而不是直接将这些值放入 Django 源代码。
Cloud Run 和 Cloud Build 使用各自的服务帐号与 Secret 进行交互。服务帐号由包含项目编号的电子邮件地址标识。将 Django 环境文件创建为 Secret Manager Secret
您可以将启动 Django 所需的设置存储在安全的环境变量文件中。示例应用使用 Secret Manager API 检索密钥值,并使用 django-environ
软件包将值加载到 Django 环境中。Secret 配置为可由 Cloud Run 和 Cloud Build 访问。
创建一个名为
.env
的文件,该文件定义数据库连接字符串、媒体存储分区名称以及新的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
将 Secret 存储在 Secret Manager 中:
控制台
在 Cloud Console 中,转到 Secret Manager 页面。
点击创建 Secret
在名称字段中,输入
django_settings
。在 Secret value 对话框中,粘贴
.env
文件的内容。点击创建密钥。
在 django_settings 的详细信息中,记下项目编号:
projects/PROJECTNUM/secrets/django_settings
删除本地文件,以防被本地设置覆盖。
gcloud
使用
.env
文件的值创建新的 Secretdjango_settings
:gcloud secrets create django_settings --data-file .env
如需确认创建密钥,请检查:
gcloud secrets describe django_settings gcloud secrets versions access latest --secret django_settings
获取项目编号 (
PROJECTNUM
) 的值:export PROJECTNUM=$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')
删除本地文件以防本地设置覆盖:
rm .env
配置对 Secret 的访问权限:
控制台
- 点击权限标签页。
- 点击添加。
- 在新成员字段中,输入
PROJECTNUM-compute@developer.gserviceaccount.com
,然后按Enter
。 - 在新成员字段中,输入
PROJECTNUM@cloudbuild.gserviceaccount.com
,然后按Enter
。 - 在角色下拉菜单中,选择 Secret Manager Secret Accessor。
- 点击保存。
gcloud
向 Cloud Run 服务帐号授予对 Secret 的访问权限:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
向 Cloud Build 服务帐号授予对 Secret 的访问权限:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
在输出中,确认
bindings
将两个服务帐号列为成员。
为 Django 管理员密码创建 Secret
Django 管理员用户通常通过运行交互式管理命令 createsuperuser
创建。
本教程使用数据迁移创建管理员用户,从 Secret Manager 中检索管理员密码。
控制台
- 在 Cloud Console 中,转到 Secret Manager 页面。
点击创建密钥。
在名称字段中,输入
superuser_password
。在密钥值字段中,输入随机的唯一密码。
点击创建密钥。
在
superuser_password
的详细信息中,记下项目编号 (projects/PROJECTNUM/secrets/superuser_password
)。点击权限标签页。
点击添加。
在新成员字段中,输入
PROJECTNUM@cloudbuild.gserviceaccount.com
,然后按Enter
。在角色下拉菜单中,选择 Secret Manager Secret Accessor。
点击保存。
gcloud
根据随机生成的密码创建新的 Secret
superuser_password
:echo -n "$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 30 | head -n1)" | gcloud secrets create superuser_password --data-file -
向 Cloud Build 授予对 Secret 的访问权限:
gcloud secrets add-iam-policy-binding superuser_password \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
在输出中,确认
bindings
仅将 Cloud Build 列为成员。
授予 Cloud Build 对 Cloud SQL 的访问权限
为了让 Cloud Build 应用数据库迁移,您需要授予 Cloud Build 访问 Cloud SQL 的权限。
控制台
在 Cloud Console 中,转到 Identity and Access Management 页面。
要修改
PROJECTNUM@cloudbuild.gserviceaccount.com
的条目,请点击 修改。点击添加其他角色
在选择角色对话框中,选择 Cloud SQL 客户。
点击保存。
gcloud
授予 Cloud Build 访问 Cloud SQL 的权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/cloudsql.client
在本地计算机上运行应用
配置后备服务后,您就可以在计算机上运行应用了。此设置可用于本地开发和应用数据库迁移。请注意,数据库迁移也在 Cloud Build 中应用,但您需要设置此本地才能 makemigrations
。
在单独的终端中,启动 Cloud SQL Auth 代理:
Linux/macOS
./cloud_sql_proxy -instances="PROJECT_ID:REGION:INSTANCE_NAME"=tcp:5432
Windows
cloud_sql_proxy.exe -instances="PROJECT_ID:REGION:INSTANCE_NAME"=tcp:5432
此步骤会建立从本地计算机到您的 Cloud SQL 实例的连接,以进行本地测试。在您对应用进行本地测试的整个过程中,请确保 Cloud SQL Auth 代理一直运行。在单独的终端中运行此过程可让您在此过程运行时继续工作。
在新终端中,在本地设置项目 ID(由 Secret Manager API 使用):
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Windows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID
设置一个环境变量,以表明您正在使用 Cloud SQL Auth 代理(在代码中识别此值):
Linux/macOS
export USE_CLOUD_SQL_AUTH_PROXY=true
Windows
set USE_CLOUD_SQL_AUTH_PROXY=true
运行 Django 迁移以设置模型和资源:
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstatic
启动 Django Web 服务器:
python manage.py runserver
在浏览器中,转到 http://localhost:8000。
页面上会显示以下文本:“Hello, world. 您可以查看投票索引。在计算机上运行的 Django Web 服务器提供示例应用页面。
按
Ctrl
/Cmd
+C
可停止本地网络服务器。
将应用部署到 Cloud Run
借助后备服务设置,您现在可以部署 Cloud Run 服务。
使用提供的
cloudmigrate.yaml
,使用 Cloud Build 构建映像,运行数据库迁移,并填充静态资源:gcloud builds submit --config cloudmigrate.yaml \ --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
第一次构建需要几分钟时间才能完成。
构建成功后,首次部署 Cloud Run 服务,设置服务区域、基础映像和连接的 Cloud SQL 实例:
gcloud run deploy polls-service \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/polls-service \ --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \ --allow-unauthenticated
您应该会看到显示部署成功的输出,其中包含服务网址:
Service [polls-service] revision [polls-service-00001-tug] has been deployed and is serving 100 percent of traffic at https://polls-service-<hash>-uc.a.run.app
现在服务网址已知,请更新服务以将此值设置为环境变量:
SERVICE_URL=$(gcloud run services describe polls-service --platform managed \ --region REGION) gcloud run services update polls-service \ --platform managed \ --region REGION \ --set-env-vars CLOUD_RUN_SERVICE_URL=$(SERVICE_URL)
如需查看已部署的服务,请转到服务网址。
如需登录 Django 管理员,请在网址后附加
/admin
,然后使用用户名admin
和之前设置的密码登录。
更新应用
虽然初始配置和部署步骤较为复杂,但更新流程更为简单:
运行 Cloud Build 构建和迁移脚本:
gcloud builds submit --config cloudmigrate.yaml \ --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION
部署服务,仅指定区域和映像:
gcloud run deploy polls-service \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/polls-service
针对生产环境进行配置
您现在已具备有效的 Django 部署,但您可以采取进一步措施来确保应用做好生产准备。
停用调试功能
确认 mysite/settings.py
中的 DEBUG
变量设置为 False
。这样可以防止向用户显示详细的错误页面,这可能会泄露配置相关信息。
限制数据库用户权限
使用 Cloud SQL 创建的任何用户都具有与 cloudsqlsuperuser
角色关联的权限:CREATEROLE
、CREATEDB
和 LOGIN
。
为防止 Django 数据库用户拥有这些权限,请在 PostgreSQL 中手动创建该用户。您需要安装 psql
交互式终端,或使用预安装此工具的 Cloud Shell。
控制台
-
In the Google Cloud console, activate Cloud Shell.
在 Cloud Shell 中,使用内置终端连接到您的
INSTANCE_NAME
实例:gcloud sql connect INSTANCE_NAME --user postgres
输入 postgres 用户密码。
您目前使用的是
psql
。您应该会看到postgres=>
提示符。创建用户:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
将
PASSWORD
替换为随机的唯一密码。将新用户授予完整数据库的全部权限:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
退出
psql
:\q
gcloud
启动与 SQL 实例的连接:
gcloud sql connect INSTANCE_NAME --user postgres
将
INSTANCE_NAME
替换为已创建的 Cloud SQL 实例。输入 postgres 用户密码。
您目前使用的是
psql
。您应该会看到postgres=>
提示符。创建用户:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
将新用户授予完整数据库的全部权限:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
退出
psql
:\q
设置最低权限
默认情况下,此服务使用默认计算服务帐号进行部署。但是,在某些情况下,使用默认服务帐号可能会提供过多的权限。如果您希望限制性更强,则需要创建自己的服务帐号,并仅分配服务所需的权限。所需权限因服务而异,具体取决于特定服务使用的资源。
此服务所需的最低项目角色如下:
- Cloud Run Invoker
- Cloud SQL 客户
- Storage Admin,位于媒体存储分区
- Secret Manager Accessor,访问 Django 设置密钥。(服务本身不需要访问 Django 管理员密钥。)
如需创建具有所需权限的服务帐号,并将其分配给服务,请运行以下命令:
在
gcloud
CLI 中,创建一个具有所需角色的服务帐号:gcloud iam service-accounts create polls-service-account SERVICE_ACCOUNT=polls-service-account@PROJECT_ID.iam.gserviceaccount.com # Cloud Run Invoker gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/run.invoker # Cloud SQL Client gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/cloudsql.client # Storage Admin, on the media bucket gsutil iam ch \ serviceAccount:${SERVICE_ACCOUNT}:roles/storage.objectAdmin \ gs://MEDIA_BUCKET # Secret Accessor, on the Django settings secret. gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/secretmanager.secretAccessor
部署服务,并将其与新服务帐号相关联:
gcloud run services update polls-service \ --platform managed \ --region REGION \ --service-account ${SERVICE_ACCOUNT}
了解代码
示例应用
Django 示例应用使用标准 Django 工具创建。以下命令用于创建项目和轮询应用:
django-admin startproject mysite
python manage.py startapp polls
基本视图、模型和路由配置复制自编写您的第一个 Django 应用(第 1 部分和第 2 部分)。
来自 Secret Manager 的 Secret
settings.py
文件包含代码,该代码使用 Secret Manager Python API 检索最新版本的已命名 Secret 并将其拉取到环境中(使用 django-environ
):
此密文用于存储多个密文值,以减少需要配置的不同密文的数量。虽然可以直接从命令行创建 superuser_password
,但现在仍使用基于文件的方法。如果通过命令行生成,应谨慎使用 head -c
确定随机生成的字符串的长度,同时确保文件末尾没有换行符,否则将在 Django 管理员中输入密码时引发问题。
CSRF 配置
Django 内置了针对跨站请求伪造 (CSRF) 的保护机制。从 Django 4.0 开始,对其工作方式的更改意味着必须告诉 Django 它的托管网址是什么,以便可以为提交数据的用户提供最佳保护。
将应用的网址作为环境变量提供给 settings.py
文件。这是 Django 在相关设置中使用的值。
本地密钥替换值
如果在本地文件系统上发现 .env
文件,则使用该文件,而不是 Secret Manager 中的值。在本地创建 .env
文件有助于进行本地测试(例如,针对 SQLite 数据库进行本地开发,或其他本地设置)。
数据库连接
settings.py
文件包含 SQL 数据库的配置。如果您设置了 USE_CLOUD_SQL_AUTH_PROXY
,则 DATABASES
设置会更改为推断 Cloud SQL 身份验证代理的使用情况。
云存储静态
settings.py
文件还使用 django-storages
将 Cloud Storage 媒体存储分区直接集成到项目中:
使用 Cloud Build 实现自动化
cloudmigrate.yaml
文件不仅执行典型的映像构建步骤(创建容器映像并将其推送到 Container Registry),还执行 Django migrate
和 collectstatic
命令。这些代理需要访问数据库,该数据库是使用 app-engine-exec-wrapper(Cloud SQL Auth 代理的帮助程序)执行的:
此配置使用替代变量。直接更改该文件中的值意味着可以在迁移时删除 --substitutions
标志。
在此配置中,仅应用现有迁移。您需要使用在本地运行应用中定义的 Cloud SQL Auth 代理方法,在本地创建迁移。您可以根据需要扩展此模板,以运行其他 manage.py
命令。
要扩展 Cloud Build 配置以将部署包含在一个配置中,而无需运行两个命令,请参阅使用 Cloud Build 从 Git 进行持续部署。如上所述,这需要 IAM 更改。
通过数据迁移创建超级用户
Django 管理命令 createsuperuser
只能以交互方式运行,也就是说,当用户输入信息以响应提示时。虽然您可以将此命令与 Cloud SQL 代理搭配使用,并在本地 Docker 设置中执行命令,但另一种方法是创建超级用户作为数据迁移:
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或保留项目并删除个别资源。
删除项目
- 在 Google Cloud 控制台中,进入管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
后续步骤
- 了解如何为生产环境配置 PostgreSQL
- 详细了解 Google Cloud 上的 Django