【问题标题】:What is the proper way import python modules for dev_appserver?为 dev_appserver 导入 python 模块的正确方法是什么?
【发布时间】:2019-04-23 18:08:54
【问题描述】:

意图

我正在为 App Engine 创建一个 CRUD 应用程序,其中用户通过 OAuth 进行身份验证,服务器将他们的访问和刷新令牌存储在 Datastore 中。我正在使用dev_appserver 进行本地测试,并陷入困境:

  • python37 运行时无法为 Datastore 导入 ndb 模块,python27 运行时无法导入 google.auth 模块。

问题陈述

Python37

在python37运行时,检测到我的requirements.txt文件,所有依赖都安装正确。但是,此运行时似乎目前不支持 ndb 模块以调用数据存储区 API。

    from google.appengine.ext import ndb
ModuleNotFoundError: No module named 'google.appengine'

解决我的问题的一种方法是手动安装 ndb 包,但我不相信它在此时开源。

我很可能会继续使用google-api-python-client 与数据存储区交互。不过,我仍然有兴趣解决下面列出的问题,以便更好地理解 Python 模块在 App Engine 中的工作方式。

Python27

在 python27 运行时,requirements.txt 被忽略。我的解决方法是包含所有依赖项源代码的最新版本。为此,我使用源代码填充名为dependencies 的目录,然后将符号链接添加到根模块。 (这也是学习如何导入 python 模块的一个很好的练习)

项目结构

目录

.
├── api.py
├── app
│   ├── build
│   ├── config
│   ├── dist
│   ├── index.html
│   ├── node_modules
│   ├── package.json
│   ├── package-lock.json
│   ├── src
│   └── static
├── app.yaml
├── dependencies
│   ├── click-7.0
│   ├── flask-1.0.2
│   ├── google-auth-library-python-1.6.3
│   ├── google-auth-library-python-oauthlib-0.3.0
│   ├── itsdangerous-1.1.0
│   ├── jinja-2.10.1
│   └── markupsafe-1.1.1
├── libs
│   ├── click -> ../dependencies/click-7.0/click/
│   ├── flask -> ../dependencies/flask-1.0.2/flask/
│   ├── google -> ../dependencies/google-auth-library-python-1.6.3/google/
│   ├── google_auth_oauthlib -> ../dependencies/google-auth-library-python-oauthlib-0.3.0/google_auth_oauthlib/
│   ├── __init__.py
│   ├── itsdangerous -> ../dependencies/itsdangerous-1.1.0/src/itsdangerous/
│   ├── jinja2 -> ../dependencies/jinja-2.10.1/jinja2/
│   └── markupsafe -> ../dependencies/markupsafe-1.1.1/src/markupsafe/
├── requirements.txt
└── spa.py

Python 代码

在我的服务器文件spa.pyapi.py 中,我在python 路径中包含libs,如下所示:

import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), 'libs'))

这适用于导入语句,例如

import google_auth_oauthlib.flow  # works

from flask import Flask, request, session, redirect  # works

但它失败了

import google.auth  # does not work

例外

Traceback (most recent call last):
  File "<HOME>/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "<HOME>/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "<HOME>/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "<HOME>/vue-scheduler/api.py", line 6, in <module>
    import google.auth
  File "<HOME>/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/runtime/sandbox.py", line 1149, in load_module
    raise ImportError('No module named %s' % fullname)
ImportError: No module named google.auth

我相信我已经为 python 导入auth 子模块正确设置了一切。 __init__.py 文件存在,应该让 python 递归遍历嵌套的模块目录。但是找不到auth

【问题讨论】:

    标签: python google-app-engine google-cloud-platform import


    【解决方案1】:

    对于第一代 GAE 标准环境 (Python 2.7),应用程序处理依赖项与常规 Python 应用程序有点不同。尽量不要有创意,因为如果遇到麻烦就更难获得帮助。

    对于 GAE 提供的第 3 方内置库中包含的库,您可以在 app.yaml 文件中 just request them

    GAE 未提供的第 3 方库(或您有意使用自己的版本/副本的库)必须在您的应用程序中使用 copied/vendored-in

    只选择一种方法,尝试对同一个库同时执行这两种方法也可能会导致麻烦。

    【讨论】:

      【解决方案2】:

      ndb ORM 库不适用于 Python 3。您可以:

      1. 通过 Cloud Datastore API 访问 Cloud Datastore。您可以使用 Google Cloud client libraries 从 Cloud Datastore 存储和检索数据。
      2. 等待ndb 被移植到 Python 3。目前正在进行中,您可以在此处关注:https://github.com/Googleapis/python-ndb

      不建议继续使用 Python 2.7 运行时,因为 Python 2.7 将于 2020 年 1 月 1 日终止。

      【讨论】:

      • 这是我最关心的问题。开始时为将在不到一年的时间内弃用的运行时进行开发似乎很愚蠢。我想我很惊讶 python3 的 ndb 库还没有发布,即使截止日期越来越近。我可能会使用googleapis 继续前进。谢谢你的建议!
      • 明确一点:运行时不会在该日期被弃用。 Python 软件基金会在该日期将不再支持该版本的语言,这意味着没有新版本或版本。
      • 很高兴听到 ndb 将支持 Python 3。我希望它提供与 Python 2 相同的缓存功能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多