python - 为 dev_appserver 导入 python 模块的正确方法是什么?
问题描述
意图
我正在为 App Engine 创建一个 CRUD 应用程序,其中用户通过 OAuth 进行身份验证,服务器将他们的访问和刷新令牌存储在 Datastore 中。我正在做本地测试,dev_appserver
并被困在岩石和坚硬的地方:
python37 运行时无法导入python27 运行时无法导入ndb
数据存储模块,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
我很可能会通过使用与 Datastore 进行交互来继续前进。但是,我仍然有兴趣解决下面概述的问题,以便更好地理解 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.py
,api.py
我libs
在 python 路径中包含如下:
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
.
解决方案
ORM库ndb
不适用于 Python 3。您可以:
- 通过 Cloud Datastore API访问Cloud Datastore 。您可以使用Google Cloud 客户端库从 Cloud Datastore 存储和检索数据。
- 等待
ndb
移植到 Python 3。目前正在进行中,您可以在此处关注:https ://github.com/Googleapis/python-ndb
不建议继续使用 Python 2.7 运行时,因为 Python 2.7 将于 2020 年 1 月 1 日终止。
推荐阅读
- .net - 如何让 SoapUI 与 ws-security 模式“TransportWithMessageCredential”一起使用
- c# - 在使用 Windows Template Studio 创建的应用程序中更改起始页
- reactjs - 项目目录外的 node_modules 不被 Babel 转译(7)
- excel - 打开没有打开工作簿的 Excel 工作簿
- entity-framework - EF6 在内部方法中使用事务
- vue.js - Vue-CLI 3 检查文件是否存在路径文件?
- c++ - X11 和 nVidia 驱动程序的奇怪 EGL 行为
- php - JOIN 的 QueryBuilder 问题
- git - 在 TFS 上创建/更新/删除 Git 分支时触发 powershell 脚本
- vue.js - img src中的Vue js绑定变量