使用 Python 2 库

如果第三方库是不包含 C 扩展程序的纯 Python 代码,则只需将该库复制到您的应用目录,便可以开始使用。如果已内置第三方库并与运行时捆绑,那么您无需将其复制到自己的应用,便可以使用该库。

第三方库必须作为不包含 C 扩展程序的纯 Python 代码实施。如果将这些库复制到应用目录,它们将计入文件配额,因为该库会与您的应用代码一同上传到 App Engine。

复制第三方库

要使用与运行时捆绑的内置库列表中未列出的第三方库,请执行以下操作:

  1. 创建一个用于存储第三方库的目录,如 lib/

    mkdir lib
    
  2. 使用带有 -t <directory> 标志的 pip(版本 6 或更高版本)将库复制到您在上一步中创建的文件夹。例如:

    pip install -t lib/ <library_name>
    

    要在 macOS 上使用 Homebrew Python?

  3. 在与 app.yaml 文件相同的文件夹中创建一个名为 appengine_config.py 的文件。

  4. 编辑 appengine_config.py 文件,并向 vendor.add() 方法提供库目录。

    # appengine_config.py
    from google.appengine.ext import vendor
    
    # Add any libraries install in the "lib" folder.
    vendor.add('lib')
    

    上方的 appengine_config.py 文件假设当前工作目录是 lib 文件夹所在的位置。在某些情况下,比如单元测试,当前工作目录可能有所不同。为避免出错,您可以使用以下命令,将完整路径明确传递到 lib 文件夹:

    vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
    

结合使用 pip 需求文件与复制的库

pip 可读取要从文件(称为需求文件)中安装的库列表。借助需求文件,您可以轻松为应用设置新的开发环境,并升级到新的库版本。

需求文件是一个文本文件,其中每行对应一个库,列出了软件包名称,有时还会列出软件包的版本(默认为最新版本):

Flask==0.10
Markdown==2.5.2
google-api-python-client

如需安装需求文件中的库,请使用 -r 标志以及 -t lib 标志:

pip install -t lib -r requirements.txt

使用与运行时捆绑的内置第三方库

如果第三方库列在与 App Engine Python 运行时捆绑的内置库列表中,则您只需在 app.yaml 中的 libraries 指令下指定该库即可,例如:

libraries:
- name: PIL
  version: "1.1.7"
- name: webob
  version: "1.1.1"

在部署过程中,App Engine 会自动提供请求的库。

结合使用内置捆绑库与本地开发服务器

运行时环境提供的许多内置库自动可供本地开发服务器使用。如需在本地安装一些库,您必须运行 gcloud components install app-engine-python-extras。如果本地开发服务器检测到需要此组件,则会提示您安装它。必须先在本地安装以下内置库,然后才能将它们与本地开发服务器一起使用:

您可以使用 pip 命令,从 Python 软件包索引 (PyPI) 安装所有这些软件包。

sudo pip install lxml==2.3.5

根据平台的不同,您可能需要安装构建支持工具和 Python 源,然后才能安装这些库。

  • 在 Linux 上,软件包管理系统可以提供这些前提条件,并且通常可以提供库的预构建版本。
  • 在 Windows 上,通常有预构建版本的安装程序可用。
  • 在 macOS 上,部分软件包的构建需要 Xcode 命令行工具。

无论 app.yaml 中指定哪个版本,开发服务器都会使用您在本地安装的软件包版本。如果需要,请为您的项目设置 virtualenv,以提供确切的软件包版本。请注意,virtualenv 仅在本地用于二进制软件包,并且部署后,您的应用将无法使用。要添加其他第三方库,请使用安装库中介绍的方法。

在本地开发服务器中使用 Django

Django 是适用于 Python 的功能全面的网络应用框架。该框架提供了全套可互换组件,包括调度、视图、中间件和模板组件等。

Django 数据建模接口与 App Engine 数据存储区不兼容。您可以在 Django 应用中使用 App Engine 数据建模库(dbndb)。 但是,使用 Django 数据建模接口的第三方 Django 应用(其中最值得关注的是 Django 的管理员应用)可能无法直接与 App Engine 结合使用。

默认使用数据存储区建模库 (DB)。如需将 Django 与 NDB storage API 结合使用,请将 'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware', 添加到 Django settings.py 文件中的 MIDDLEWARE_CLASSES 条目。最好将其插入到任何其他中间件类之前,因为某些其他中间件可能会进行数据存储区调用,而如果该中间件在此中间件之前调用,那么将无法正确处理那些中间件。 如需详细了解 Django 中间件,请参阅项目文档

如需在应用中启用 Django,请在 app.yaml 中指定 WSGI 应用和 Django 库:

...
handlers:
- url: /.*
  script: main.app  # a WSGI application in the main module's global scope

libraries:
- name: django
  version: "1.4"

在导入软件包之前,必须将 DJANGO_SETTINGS_MODULE 环境变量设置为 Django 设置模块的名称(通常为 'settings')。

如果 Django 设置模块不是 settings.py,请在 app.yaml 文件中相应地设置 DJANGO_SETTINGS_MODULE 环境变量:

env_variables:
  DJANGO_SETTINGS_MODULE: 'myapp.settings'

或者在 Python 代码中:

import os
# specify the name of your settings module
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

import django.core.handlers.wsgi
app = django.core.handlers.wsgi.WSGIHandler()

在本地开发服务器中使用 matplotlib

Matplotlib 是绘图库,可生成各种图片格式的图表和图形。App Engine 不支持 matplotlib 的交互模式,还有其他一些功能也不可用。这意味着,正如许多 matplotlib 教程所建议,您不能使用 pyplot.show()。相反,您应该使用 pyplot.savefig() 将图片数据写入到输出流、cStringIO.StringIO 实例或使用 Cloud Storage 客户端库的 Google Cloud Storage。

Matplotlib 允许使用 matplotlibrc 配置文件进行大量自定义,该配置文件应该位于应用的顶级目录中。或者,您可以将 MATPLOTLIBRC 环境变量设为与应用目录相对应的路径。

默认backend为 AGG,可写入所有支持格式的文件:PNG(默认格式)、RAW、PS、PDF、SVG 和 SVGZ。如果您通过将 PIL 添加到 app.yamllibraries 部分来提供 PIL 库,则 AGG 后端也将自动支持写入 JPEG 和 TIFF 图片格式。

Matplotlib 附带许多自动提供的字体。您也可以使用自定义字体,方法是将 TTF 格式的自定义字体随您的应用一同上传,并将 TTFPATH 环境变量设为字体所在的路径(相对于您应用的路径)。如需了解详情,请参阅 app.yaml 参考文档。

App Engine 不支持许多 matplotlib 功能。特别是:

  • 没有 ~/.matplotlib 目录。但是,如上所述,您可将 matplotlibrc 配置文件放在备用位置。
  • 不支持交互式后端和 GUI 元素。
  • 不支持 EMF、Cairo 和 GDK 后端。
  • 没有缓存,因此许多机制都要重新计算或重新下载通常会缓存的数据。已停用的具体缓存机制包括通过 matplotlib.font_manager.FontManager.findfont 计算的字体数据、通过 matplotlib.cbook.get_sample_data 下载的示例数据以及通过 matplotlib.finance.fetch_historical_yahoo 下载的财务数据。
    • 由于没有缓存,因此除非将 examples.download 设为 False,否则无法用 asfileobj=False 调用 [matplotlib.cbook.get_sample_data](http://matplotlib.org/api/cbook_api.html#matplotlib.cbook.get_sample_data)
  • 调用外部命令的所有功能均已停用。
  • matplotlib.test 函数已停用。

后续步骤