为dev_appserver导入python模块的正确方法是什么?

时间:2019-04-23 18:08:55

标签: python google-app-engine import

意图

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

  • python37运行时无法导入数据存储的ndb模块, python27运行时无法导入google.auth模块。

问题陈述

Python37

在python37运行时中,检测到我的requirements.txt文件,并正确安装了所有依赖项。但是,似乎该运行时当前不支持ndb模块的本地支持,无法调用Datastore 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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

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

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