在 App Engine 标准环境中运行的 Django 应用会根据流量动态扩缩。
本教程假定您熟悉 Django 网络开发。如果您刚开始接触 Django 开发,最好先查看编写您的第一个 Django 应用,然后再继续操作。
本教程专门演示 Django,但您可以将此部署过程与其他基于 Django 的框架(例如 Wagtail 和 Django CMS)搭配使用。
本教程使用 Django 4,它至少需要 Python 3.8。 App Engine 标准环境支持 Python 3.7 及更高版本,包括 Python 3.8。
目标
在此教程中,您将学习以下操作:
- 创建并连接 Cloud SQL 数据库。
- 创建和使用 Secret Manager Secret 值。
- 将 Django 应用部署到 App Engine 标准环境。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API, Secret Manager, and Cloud Build APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 初始化 App Engine 并选择您的首选区域(如果您尚未执行此操作):
gcloud app create
准备环境
克隆示例应用
Django 示例应用的代码位于 GitHub 上的 GoogleCloudPlatform/python-docs-samples 代码库中。
您可以下载该示例的 ZIP 文件并将其解压缩,或将代码库克隆到本地机器:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
转到包含示例代码的目录:
Linux/macOS
cd python-docs-samples/appengine/standard_python3/django
Windows
cd python-docs-samples\appengine\standard_python3\django
确认 Python 设置
本教程依赖 Python 在您的机器上运行示例应用。示例代码还需要安装依赖项。
如需了解详情,请参阅 Python 开发环境指南。
确认您的 Python 版本至少为 3.8。
python -V
您应该会看到
Python 3.8.0
或更高版本。创建 Python 虚拟环境并安装依赖项:
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
下载 Cloud SQL Auth 代理以从本地机器连接到 Cloud SQL
部署后,您的应用将使用内置的 Cloud SQL Auth 代理 App Engine 标准环境与您的 Cloud SQL 进行通信 实例。但要在本地测试应用,您必须在开发环境中安装和使用该代理的本地副本。 如需了解详情,请参阅 Cloud SQL Auth 代理指南。
Cloud SQL Auth 代理使用 Cloud SQL API 与 SQL 实例进行交互。为此,它需要通过 gcloud CLI 进行应用身份验证。
对 API 进行身份验证并获取凭据:
gcloud auth application-default login
将 Cloud SQL Auth 代理下载并安装到本地机器上。
Linux 64 位
- 下载 Cloud SQL Auth 代理:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/cloud-sql-proxy.linux.amd64
- 使 Cloud SQL Auth 代理可执行:
chmod +x cloud-sql-proxy
Linux 32 位
- 下载 Cloud SQL Auth 代理:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/cloud-sql-proxy.linux.386
- 如果找不到
curl
命令,请运行sudo apt install curl
并重复执行下载命令。 - 使 Cloud SQL Auth 代理可执行:
chmod +x cloud-sql-proxy
macOS 64 位
- 下载 Cloud SQL Auth 代理:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/cloud-sql-proxy.darwin.amd64
- 使 Cloud SQL Auth 代理可执行:
chmod +x cloud-sql-proxy
Mac M1
- 下载 Cloud SQL Auth 代理:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/cloud-sql-proxy.darwin.arm64
- 使 Cloud SQL Auth 代理可执行:
chmod +x cloud-sql-proxy
Windows 64 位
右键点击 https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/cloud-sql-proxy.x64.exe,然后选择链接另存为以下载 Cloud SQL Auth 代理。将文件重命名为cloud-sql-proxy.exe
。Windows 32 位
右键点击 https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/cloud-sql-proxy.x86.exe,然后选择链接另存为以下载 Cloud SQL Auth 代理。将文件重命名为cloud-sql-proxy.exe
。Cloud SQL Auth 代理 Docker 映像
Cloud SQL Auth 代理有不同的容器映像,例如
distroless
、alpine
和buster
。默认的 Cloud SQL Auth 代理容器映像使用不包含 shell 的distroless
。如果您需要 shell 或相关工具,请下载基于alpine
或buster
的映像。如需了解详情,请参阅 Cloud SQL Auth 代理容器映像。您可以通过 Docker 使用以下命令将最新映像拉取到本地机器:
docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.13.0
其他操作系统
对于此处未列出的其他操作系统,您可以通过源代码编译 Cloud SQL Auth 代理。您可以选择将下载的文件移到其他位置,例如
PATH
上的某个位置或主目录。如果您选择这样做,则在本教程的后面部分启动 Cloud SQL Auth 代理时,请务必在使用cloud-sql-proxy
命令时引用您选择的位置。- 下载 Cloud SQL Auth 代理:
创建支持性服务
本教程使用多种 Google Cloud 服务来提供支持已部署 Django 项目的数据库、媒体存储和 Secret 存储。这些服务部署在特定区域。为了提高服务之间的效率,所有服务都应部署在同一区域中。如需详细了解离您最近的区域,请参阅各区域可使用的产品。
本教程使用 App Engine 标准环境中的集成式静态资源托管机制。设置 Cloud SQL for PostgreSQL 实例
Django 官方支持多个关系型数据库,但为 PostgreSQL 提供了最全面的支持。Cloud SQL 支持 PostgreSQL,因此本教程选择使用此类型的数据库。
以下部分介绍了如何为应用创建 PostgreSQL 实例、数据库和数据库用户。
创建 PostgreSQL 实例:
控制台
在 Google Cloud 控制台中,前往 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
替换为安全密码。
在 Secret Manager 中存储 Secret 值
现在,支持性服务已配置完毕,Django 需要关于这些服务的信息。本教程使用 Secret Manager 安全地存储这些值,而不是直接将这些信息放入 Django 源代码中。
App Engine 标准环境使用服务账号与 Secret 进行交互。将 Django 环境文件创建为 Secret Manager 的 Secret
将 Django 启动所需的设置存储在安全的 env 文件中。示例应用使用 Secret Manager API 检索 Secret
值,以及 django-environ
包将值加载到 Django 环境中。Secret 配置为可供 App Engine 标准环境访问。
创建一个名为
.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 中:
控制台
在 Google Cloud 控制台中,前往 Secret Manager 页面。
点击创建 Secret。
在名称字段中,输入
django_settings
。在 Secret 值对话框中,粘贴
.env
文件的内容。点击创建密钥。
删除本地文件以防止本地设置覆盖。
gcloud
使用
.env
文件的值创建新的 Secretdjango_settings
:gcloud secrets create django_settings --data-file .env
要确认创建 Secret,请进行检查:
gcloud secrets describe django_settings gcloud secrets versions access latest --secret django_settings
删除本地文件以防止本地设置覆盖:
rm .env
配置对 Secret 的访问权限:
控制台
- 点击权限标签页。
- 点击添加。
- 在新成员字段中,输入
PROJECT_ID@appspot.gserviceaccount.com
,然后按Enter
。 - 在角色下拉菜单中,选择 Secret Manager Secret Accessor。
- 点击保存。
gcloud
向 App Engine 标准环境服务账号授予对 Secret 的访问权限:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
在本地计算机上运行应用
配置支持性服务后,您现在可以在计算机上运行应用。此设置允许本地开发、创建超级用户以及应用数据库迁移。
在一个单独的终端中,启动 Cloud SQL Auth 代理:
Linux/macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAME
Windows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME
此步骤会建立从本地计算机到您的 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 网络服务器:
python manage.py runserver 8080
在浏览器中,前往 http://localhost:8080。
如果您使用的是 Cloud Shell,请点击网页预览按钮,然后选择在端口 8080 上预览。
该页面将显示以下文本:“Hello, world. You're at the polls index."。您的计算机上运行的 Django 网络服务器会提供示例应用页面。
按
Ctrl
/Cmd
+C
停止本地网络服务器。
使用 Django 管理控制台
若要登录 Django 的管理控制台,您需要创建超级用户。由于您具有可在本地访问的数据库连接,因此可以运行管理命令:
创建超级用户。系统将提示您输入用户名、电子邮件和密码。
python manage.py createsuperuser
启动本地网络服务器:
python manage.py runserver
在浏览器中,转到 http://localhost:8000/admin。
使用您在运行
createsuperuser
时使用的用户名和密码登录管理站点。
将应用部署到 App Engine 标准环境
设置所有支持性服务并在本地测试应用后,您现在可以将应用部署到 App Engine 标准环境了:
- 运行以下命令来上传应用,该命令会部署应用(如
app.yaml
中所述),并将新部署的版本设置为默认版本,从而使其能够处理所有新流量:gcloud app deploy
- 出现提示时,输入“yes”以确认设置。
- 等待更新已完成的通知消息。
- 打开
app.yaml
并使用已部署的网址更新APPENGINE_URL
的值:... env_variables: APPENGINE_URL: https://PROJECT_ID.uc.r.appspot.com
- 上传您的配置更改:
gcloud app deploy
运行已部署的应用
应用已部署,现在可以访问:
打开已部署的网站:
gcloud app browse
或者,您也可以显示网址并将其手动打开:
gcloud app describe --format "value(defaultHostname)"
您的请求由在 App Engine 标准环境中运行的网络服务器来进行处理。
更新应用
如需更新应用,请对代码进行更改,然后再次运行 gcloud app deploy
命令。
部署会创建应用的新版本并将其提升为默认版本。应用的早期版本仍会保留。所有这些应用版本都是可计费资源。要减少费用,请删除应用的非默认版本。
针对生产环境进行配置
现在,您已有一个有效的 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
了解代码
示例应用
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
):
Secret 用于存储多个 Secret 值,以减少需要配置的不同 Secret 的数量。
CSRF 配置
Django 具有防范跨网站请求伪造 (CSRF) 的内置保护功能。从 Django 4.0 开始,对此功能的工作方式的更改意味着必须告知 Django 此功能的托管网址,以便 Django 可为提交数据的用户提供最佳保护。
您可以在 settings.py
文件中提供应用的网址作为环境变量。这是 Django 用于相关设置的值。
本地 Secret 替换
如果系统在本地文件系统上发现 .env
文件,则使用该文件,而不是 Secret Manager 中的值。在本地创建 .env
文件有助于进行本地测试(例如,针对 SQLite 数据库进行本地开发,或者进行其他本地设置)。
数据库连接
settings.py
文件包含 SQL 数据库的配置。它使用 django-environ
中的 env.db()
帮助程序将 DATABASE_URL
中设置的连接字符串加载到 DATABASES
设置中。
在本地运行应用并使用 Cloud SQL Auth 代理访问
托管数据库,USE_CLOUD_SQL_AUTH_PROXY
标志用于调整数据库
才能使用代理。
托管的静态内容
app.yaml
文件包含用于部署到 App Engine 的配置信息。此 app.yaml
文件指定 App Engine 将从 static/
目录传送静态文件:
在本地运行启用了 DEBUG
的应用后,Django 将在本地传送这些文件:
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.