Flask 在 App Engine 标准环境中的使用入门

本指南向您介绍如何开发和部署在 Google App Engine 标准环境中运行的基本 Python 2.7 应用。本指南适用于刚接触 Google App Engine 及其相关服务,尤其是刚接触通过 Python 语言使用 App Engine 的用户。因此,本指南为每项任务提供了比快速入门指南中更深入的说明。

准备工作

在开发应用之前,您需要先做好以下准备工作:

  1. 创建新的 GCP Console 项目,或者从 Google Cloud Platform Console 中检索现有项目的 ID:

    转到“项目”页面

  2. 安装并初始化 Google Cloud SDK

创建基本应用

本指南使用 Flask 网页应用框架是因为它简单易用且具有可扩展性,但相同的原则可以适用于您要使用的任何框架。本指南为您介绍以下内容:

  • 如何创建基本用户评论表单,其中将显示用户在您创建的 HTML 模板上通过该表单提交的内容。
  • 如何创建可以提供静态文件(如 CSS 或图片)的基本应用。

设置开发环境后,您可以为应用编写代码并将其部署到 App Engine。

应用项目的基本结构

本指南对 flask-app 项目使用以下结构:

flask-app 项目结构

  • app.yaml:配置 App Engine 应用的设置
  • main.py:写入应用内容
  • static:用于存储静态文件的目录
    • style.css:用于设置模板文件的外观和风格样式的基本样式表
  • templates:所有 HTML 模板的目录
    • form.html:用于显示表单的 HTML 模板
    • submitted_form.html:用于显示已提交表单的内容的 HTML 模板

设置库以启用开发

本教程将 Flask 库的一个副本放在应用的目录中。请注意,尽管 App Engine Python 2.7 运行时环境具有捆绑的 Flask 库,但该捆绑库的版本较旧,可能无法与本教程一起使用。

要设置所需的库,请执行以下操作:

  1. 在根项目目录中创建名为 appengine_config.py 的文件。当您部署应用时,可以使用此文件指定 App Engine 应该在其中查找第三方库的位置:

    from google.appengine.ext import vendor
    
    # Add any libraries installed in the "lib" folder.
    vendor.add('lib')
  2. 在根项目目录中创建名为 requirements.txt 的文件:

    Flask==0.12.4
    Werkzeug<0.13.0,>=0.12.0
    
  3. 要在本地计算机上运行此应用,您需要设置 Python 开发环境,包括 Python、pipvirtualenv。如需查看说明,请参阅为 Google Cloud Platform 设置 Python 开发环境

  4. 使用 virtualenv 安装依赖项:

    Mac OS/Linux

    1. 在项目以外的目录中创建一个独立的 Python 环境并将其激活:
      virtualenv env
      source env/bin/activate
      在本教程结束时,您可以通过键入 deactivate 退出 virtualenv
    2. 导航到项目目录并安装依赖项:
      cd YOUR_PROJECT
      pip install -t lib -r requirements.txt

    Windows

    如果您已安装 Cloud SDK,则应该也已安装 Python 2.7,它通常位于 C:\python27_x64\(对于 64 位系统)。使用 Powershell 运行 Python 包。

    1. 找到已安装的 Powershell
    2. 右键点击 Powershell 的快捷方式,并以管理员身份启动。
    3. 尝试运行 python 命令。如果未找到,请将 Python 文件夹添加到环境的 PATH
      $env:Path += ";C:\python27_x64\"
    4. 在项目以外的目录中创建一个独立的 Python 环境并将其激活:
      python -m virtualenv env
      env\Scripts\activate
      在本教程结束时,您可以通过键入 deactivate 退出 virtualenv
    5. 导航到项目目录并安装依赖项:
      cd YOUR_PROJECT
      python -m pip install -t lib -r requirements.txt

    -t lib 标志用于将库复制到 lib 文件夹中,该文件夹会在部署期间上传到 App Engine。如需详细了解如何复制第三方库,请参阅将 pip requirements.txt 与复制的库结合使用

    -r requirements.txt 标志用于指示 pip 安装 requirements.txt 文件中的所有内容。

创建 app.yaml 文件

您可以在 app.yaml 文件中配置 App Engine 应用的设置,该文件是您手动创建的,或是在创建开发项目过程中创建的。app.yaml 文件是一个配置文件,用于告知 App Engine 如何运行您的应用,以及如何将网址映射到静态文件和 Python 模块。

要创建 app.yaml 文件,请执行以下操作:

  1. 在项目的根目录中创建名为 app.yaml 的文件。
  2. 将以下代码行添加到文件中:

    runtime: python27
    api_version: 1
    threadsafe: true
    
    handlers:
    - url: /static
      static_dir: static
    - url: /.*
      script: main.app
    

如需有关 app.yaml 文件的更多参考信息,请参阅 app.yaml 参考文档

为 Flask 应用创建请求处理程序

当 App Engine 收到针对您应用的网络请求时,它会按应用的 app.yaml 配置文件中所述,调用与网址对应的处理程序脚本。Python 2.7 运行时支持 WSGI 标准。WSGI 是首选标准,Python 2.7 的某些功能必须与其配合才能正常工作。应用的脚本处理程序的配置决定是否使用 WSGI 处理请求。

服务器会将请求的网址与应用配置文件中的网址格式进行比较,以确定要调用的 Python 应用对象。然后,服务器会使用 WSGI 标准中定义的参数来调用应用对象。应用对象会执行请求所需的操作,然后准备响应并以字符串列表的形式返回。

以下请求处理程序获取 /templates/form.html 文件中的表单所提交的信息,并将该信息放在 /templates/submitted_form.html 模板文件中:

  1. 在应用的根目录中创建名为 main.py 的新文件。

  2. 导入要使用的 Flask 框架和 Flask 接口:

    from flask import Flask, render_template, request
  3. 添加此行代码以创建 Flask 类的实例,并将其分配给名为 app 的变量:

    app = Flask(__name__)
  4. 创建一个使用 form.html 模板显示表单的请求处理程序:

    @app.route('/form')
    def form():
        return render_template('form.html')

    当用户导航到应用中的 /form/ 目录时,将显示您将创建的 form.html 模板。

  5. 创建一个处理所提交表单中的信息的请求处理程序:

    @app.route('/submitted', methods=['POST'])
    def submitted_form():
        name = request.form['name']
        email = request.form['email']
        site = request.form['site_url']
        comments = request.form['comments']
    

    应用将表单信息存储在您在此处创建的变量中。通过这些变量,您可将表单中的数据发布到您将创建的 submitted_form.html 模板上。

您可以参阅 Flask 快速入门指南,详细了解如何快速掌握 Flask 的使用方法。

您可以轻松扩展此表单的功能。例如,您可以使用 Mail APIMailgunMailjetSendGrid 将用户提交的评论发送给您自己或其他人。

设置 Jinja2 模板

由于嵌入在代码中的 HTML 很难维护,因此建议您使用模板系统,将 HTML 保存在使用特殊语法的单独文件中,以指示从应用返回的数据所显示的位置。您可以通过将选择的模板引擎与您的应用代码相互绑定来使用该模板引擎。App Engine 包含 DjangoJinja2 模板引擎,便于您使用。

  1. 将以下代码行添加到 submitted_form() 函数末尾:

    return render_template(
        'submitted_form.html',
        name=name,
        email=email,
        site=site,
        comments=comments)

    此行使用 render_template() 接口呈现包含所提交表单的信息的 submitted_form.html 模板。

  2. 创建 form.htmlsubmitted_form.html 模板:

    1. 在根目录中创建一个名为 templates 的新文件夹:

      mkdir templates
      
    2. 在项目的 templates 目录中创建 form.html

      <html>
        <head>
          <title>Submit a form</title>
         <link rel="stylesheet" type="text/css" href="/static/style.css">
        </head>
        <body>
          <div id="container">
            <div class="pagetitle">
              <h1>Submit a form</h1>
            </div>
            <div id="main">
              <form method="post" action="{{ url_for('submitted_form') }}">
                <label for="name">Name:</label>
                <input type="text" name="name"><br />
                <label for="email">Email address:</label>
                <input type="email" name="email"><br />
                <label for="site_url">Website URL:</label>
                <input type="url" name="site_url"><br />
                <label for="comments">Comments:</label>
                <textarea name="comments"></textarea><br />
                <input type="submit">
              </form>
            </div>
          </div>
        </body>
      </html>
      
    3. 在项目的 templates 目录中创建 submitted_form.html

      <html>
       <head>
         <title>Submitted form</title>
         <link rel="stylesheet" type="text/css" href="/static/style.css">
       </head>
       <body>
         <div id="container">
           <div class="pagetitle">
             <h1>Form submitted</h1>
           </div>
           <div id="main">
             <p>Thanks for your submission, {{name}}!</p>
             <p>Here's a review of the information that you sent:</p>
             <p>
                <strong>Name</strong>: {{name}} <br>
                <strong>Email</strong>: {{email}} <br>
                <strong>Website URL</strong>: {{site}} <br>
                <strong>Comments</strong>: {{comments}}
             </p>
           </div>
         </div>
       </body>
      </html>
      

如需详细了解如何在 Flask 和 Jinja2 中使用模板,请参阅 Flask 官方文档

提供静态文件

对于在请求页面时不会动态生成的某些内容(例如图片、CSS 或 Flash 动画),提供静态文件更高效。

创建一个 CSS 文件并为其创建一个处理程序:

  1. 在根目录中创建一个名为 static 的新文件夹:

    mkdir static
    
  2. 创建 style.css 文件,该文件将修改您刚创建的模板文件的外观。在项目的 static 文件夹中创建该文件,并添加以下样式:

    .pagetitle {
        color: #800080;
    }
    
  3. 您之前创建的 app.yaml 文件指定了存储静态文件的 static 目录:

    handlers:
    - url: /static
      static_dir: static
    - url: /.*
      script: main.app

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

如需详细了解网址映射以及可在 app.yaml 中指定的其他选项,请参阅 app.yaml 参考

测试应用

使用 SDK 附带的本地开发服务器 (dev_appserver.py) 测试您的应用。

  1. 从应用的 app.yaml 配置文件所在的根目录,使用以下命令启动本地开发服务器:

    dev_appserver.py app.yaml
    

    现在,本地开发服务器会运行并侦听端口 8080 上的请求。

    出现问题?

    1. 在网络浏览器中访问 http://localhost:8080/form 以查看应用。

运行本地开发服务器 (dev_appserver.py)

要运行本地开发服务器,您可以通过指定完整目录路径来运行 dev_appserver.py,也可以将 dev_appserver.py 添加到 PATH 环境变量中:

  • 如果您安装了 App Engine SDK 原始版本,则该工具位于:

    [PATH_TO_APP_ENGINE_SDK]/dev_appserver.py
    
  • 如果您安装了 Google Cloud SDK,则该工具位于:

    [PATH_TO_CLOUD_SDK]/google-cloud-sdk/bin/dev_appserver.py
    

    提示:要将 Google Cloud SDK 工具添加到 PATH 环境变量并在 shell 中启用命令补全功能,您可以运行以下命令:

    [PATH_TO_CLOUD_SDK]/google-cloud-sdk/install.sh
    

如需详细了解如何运行本地开发服务器(包括如何更改端口号),请参阅本地开发服务器参考。

更改

您可以在开发应用时保持开发服务器运行。开发服务器会监测源文件中的更改,并在必要时重新加载源文件。

  1. 立即尝试:让开发服务器保持运行,然后修改 templates/form.html,将 <h1> 标记中的 Submit a form 文字更改为其他内容。
  2. 重新加载 http://localhost:8080/form 以查看结果。

部署应用

要上传应用,请从 app.yaml 文件所在的项目根目录中运行以下命令:

gcloud app deploy

可选标志:

  • 添加 --project 标志,指定一个其他项目 ID(不同于您在 gcloud 工具中初始化为默认值的 GCP Console 项目 ID)。示例:--project [YOUR_PROJECT_ID]
  • 添加 -v 标志以指定版本 ID,如果不指定,则系统会为您生成一个版本 ID。示例:-v [YOUR_VERSION_ID]

如需详细了解如何使用命令行部署应用,请参阅部署 Python 应用

查看应用

打开浏览器并在 http://[YOUR_PROJECT_ID].appspot.com/form 上查看应用。

支持

如果在开发应用期间遇到问题,可以访问技术支持和开发者社区寻求帮助。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
App Engine standard environment for Python