注意:在未来的几个月内,我们将会重新整理 App Engine 文档网站,使得查找内容更轻松,并更好地与其他 Google Cloud 产品保持一致。将会提供相同的内容,但导航现在将与其余的 Cloud 产品相一致。 如果您在浏览网站时有疑问或者希望提交反馈,请点击“发送反馈”。

Python 3.10 现已正式发布。

存储和传送静态文件

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

除了处理动态请求之外,应用通常还需要传送静态文件(如 JavaScript、图片和 CSS)。标准环境中的应用可以通过 Google Cloud 产品(如 Cloud Storage)传送静态文件,也可以直接或使用第三方内容分发网络 (CDN) 传送这些文件。

Google Cloud 提供免费层级,因此在 Google Cloud 上托管静态网站的费用可能低于使用传统托管服务提供商的费用。

从 Cloud Storage 传送文件

Cloud Storage 可为动态 Web 应用托管静态资源。与直接从应用传送内容相比,使用 Cloud Storage 进行传送可为您带来以下好处:

  • Cloud Storage 实际起到内容分发网络的作用。这不需要任何特殊配置,因为默认情况下,任何可公开读取的对象都会在全球 Cloud Storage 网络中进行缓存。
  • 将传送静态资源的工作转交给 Cloud Storage 处理,应用本身的负载将降低。根据您拥有的静态资源数量以及访问频率,这有可能大幅度降低应用的运行费用。
  • 访问 Cloud Storage 内容的带宽费用通常较低。

您可以使用 gsutil 命令行工具Cloud Storage API 将资源上传到 Cloud Storage。

Google Cloud 客户端库中为 Cloud Storage 提供了符合语言习惯的 Ruby 3 客户端,让您可以在 App Engine 应用中使用 Cloud Storage 存储和检索数据。

从 Cloud Storage 存储分区传送文件的示例

这个简单的示例创建了一个 Cloud Storage 存储分区,并使用 Google Cloud CLI 上传静态资源:

  1. 创建存储分区。通常以项目 ID 命名存储分区(并非必需)。存储分区名称必须保持全局唯一。

    gsutil mb gs://<your-bucket-name>
    
  2. 设置 ACL,授予对存储分区中内容的读取访问权限。

    gsutil defacl set public-read gs://<your-bucket-name>
    
  3. 将内容上传到存储分区。rsync 命令通常是上传和更新资源最快速、最便捷的方法。此外,您也可以使用 cp

    gsutil -m rsync -r ./static gs://<your-bucket-name>/static
    

现在,您可以通过 https://storage.googleapis.com/<your-bucket-name>/static/... 访问静态资源了。

如需详细了解如何使用 Cloud Storage 传送静态资源(包括如何从自定义域名进行传送),请参阅如何托管静态网站

从其他 Google Cloud 服务传送文件

您还可以选择使用 Cloud CDN 或其他 Google Cloud 存储服务。

直接从您的应用传送文件

如需在标准环境中为 Python 3 传送静态文件,请在 app.yaml 文件中使用 static_dirstatic_files 元素定义处理程序。

静态文件或静态目录中的内容不受 app.yaml 文件中的扩缩设置的影响。对静态文件或静态目录的请求由 App Engine 基础架构直接处理,不会到达应用的语言运行时。

配置静态文件处理程序

如需将应用配置为从 /static 网址传送 ./public 目录,请在 app.yaml 文件中定义处理程序。

下面演示了如何传送示例应用 ./public 目录中的静态文件。此应用 index.html 页面的模板会指示浏览器加载 main.css 文件,例如:

<link type="text/css" rel="stylesheet" href="/static/css/main.css">

项目的 app.yaml 文件的 static_dir 元素中定义了 ./public 目录:

handlers:
  - url: /favicon\.ico
    static_files: favicon.ico
    upload: favicon\.ico

  - url: /static
    static_dir: public

  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

上述示例中的 handlers 部分处理了三种网址格式:

  • /favicon.ico 处理程序将专门针对 /favicon.ico 的请求映射到应用根目录中名为 favicon.ico 的文件。

  • /static 处理程序映射针对以 /static 开头的网址的请求。当 App Engine 收到针对以 /static 开头的网址的请求时,它会将路径的其余部分映射到 ./public 目录中的文件。如果在该目录中找到了相应的文件,则该文件的内容会返回给客户端。

  • /.* 处理程序匹配所有其他网址,并将它们定向到您的应用。

请注意,要使用静态处理程序,必须在 app.yaml 中指定 entrypoint 元素或者指定将 script 设为 auto 的处理程序。

网址路径格式会按照其在 app.yaml 中出现的顺序进行测试,因此,您应在 /.* 格式前面定义静态文件的格式。如需了解详情,请查看 app.yaml 参考文档

从第三方内容分发网络进行传送

您可以使用任何外部第三方 CDN 传送静态文件并缓存动态请求,但您的应用可能会遇到延迟和费用增加的情况。

为了提升性能,您应该使用支持 CDN Interconnect 的第三方 CDN。