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

2024-04-21

Intent

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

  • The python37 runtime cannot import the ndb module for Datastore and the python27 runtime cannot import the google.auth module.

问题陈述

Python37

In the python37 runtime, my requirements.txt file is detected and all dependencies are installed properly. However, it appears that this runtime does not currently have native support for the ndb module in order to make calls the Datastore API.

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

One way to solve my problem would be to manually install the ndb package, however I don't believe that it open-source at this point in time.

我很可能会使用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.py and 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

and

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文件存在并且should让 python 递归遍历嵌套的模块目录。然而它无法找到auth.


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

对于 GAE 提供的第 3 方内置库中包含的库,您可以只需要求他们 https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#using_a_built-in_third-party_library_bundled_with_the_runtime在你的app.yaml file.

GAE 未提供的第 3 方库(或您有意使用自己的版本/副本的库)必须是复制/出售 https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#copying_a_third-party_library到您的应用程序中。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Go 中通过 new(Type) 和 &Type{} 分配内存的区别

    考虑以下示例 type House struct func main house1 new House house2 House fmt Printf T T n house1 house2 Output main House main H
  • 超级丑陋的数字

    所以问题是 编写一个程序来查找第 n 个超级丑数 超级丑数是正数 其所有素数因子都在给定素数列表中 大小为 k 的素数 例如 1 2 4 7 8 13 14 16 19 26 28 32 是给定素数的前 12 个超级丑数的序列 2 7 13
  • 使用 v2.0 端点的声明中缺少 UPN

    我已经设置了一个类似于 Microsoft 的以下示例的项目 其中我有一个本机应用程序请求使用 v2 0 端点访问 Web api https github com azureadquickstarts appmodelv2 nativec
  • 通过SPARQL UPDATE从本体中删除空白节点

    我在 SPARQL UPDATE 插入 操作的帮助下将一些数据存储在 protege 中制作的本体模型中 以下是更新查询 PREFIX test
  • Direct3D 中的矩阵多阶

    关于在 Direct3D 中乘法矩阵以获得结果 我收到了两个相互矛盾的答案 教程确实规定从左到右相乘 这很好 但这不是我想象的方式 这是一个例子 OpenGL 从上到下阅读 GLRotatef 90 0f GLTranslatef 20 0
  • 将操作添加到自定义 UITableViewCell

    我正在构建一个简单的应用程序 其中包含填充了自定义视图单元格的表格视图并使用故事板 我想在用户每次点击单元格时在单元格上添加一个操作 到目前为止 我尝试创建一个IBOutle将我的手机连接到我的tableViewController并在代码
  • .net Ajax calendarExtender 在 IE7 中剪切星期六(在 Firefox 中工作正常)

    我在 IE7 中遇到了这个问题 日历中似乎缺少星期六 它在 Firefox 中显示良好 一些人建议这可能是我的其他样式表搞乱了它 所以我现在使用自定义日历 CSS 主题 但我仍然遇到同样的问题 有任何想法吗 使用的 ajax 工具包是否存在
  • GCP 计算实例的公共实例 CNAME

    Azure 提供了一种使用以下方式访问 VM 的方法 cloudapp net GCP中有类似的东西吗 如果是 我在哪里 如何查看访问实例的确切 CNAME 我读到它 googleapi com 但无法在 GCP 门户上的任何位置找到它 N
  • Scrapy - 抓取时发现的抓取链接

    我只能假设这是 Scrapy 中最基本的事情之一 但我就是不知道如何去做 基本上 我会抓取一页来获取包含本周更新的网址列表 然后我需要一一进入这些网址并从中获取信息 我目前已经设置了两个刮刀 并且它们可以完美地手动工作 因此 我首先从第一个
  • 单个字符串可以包含多行吗?

    例如 如果我将多行分配给一个字符串 如下所示 while line reader readLine null output line n 我是否可以将带有行分隔符的输出作为一个字符串返回 我正在编写一个具有客户端和服务器程序的套接字程序 其
  • ASP.NET 从母版页调用控制器方法?

    在 ASP NET MVC2 中 如何从母版页调用控制器方法 举例来说 我想在主数据中包含一些概述数据 Logo Welcome xyz total sales this month 999 Home Sales Import Export
  • 我可以让 H2 在内存数据库中自动创建模式吗?

    我已经看过了内存中的 H2 数据库 通过 Spring Hibernate 初始化模式 https stackoverflow com questions 1945175 h2 database in memory init schema
  • 抛出旧异常的同时抛出新异常

    如果在由异常引起的堆栈展开期间 C 中的析构函数抛出异常 则程序将终止 这就是为什么析构函数永远不应该在 C 中抛出 示例 struct Foo Foo throw 2 whoops already throwing 1 at this p
  • Java - 设置jScrollBar的位置

    我在 JScrollPane 中有一个 JTable 该表每隔一段时间就会获取新的数据行 最终 数据行数超出了一次显示的数量 因此 ScrollPane 启动 我希望 Scroll Pane 在每次添加新数据时跳到底部 到其最大值 所以我写
  • JWT 身份验证:使用 UI 令牌来验证 Graphene/Django (GraphQL) 查询?

    我正在开发一个具有以下架构的项目 UI 通过 Node 服务器 GraphQL 的 Apollo 客户端对客户端和服务器端渲染进行反应 API Django 通过 Graphene 处理 GraphQL 查询 我使用 Auth0 基于 JW
  • 是否可以使用“使用 PayPal 登录”代表用户发出 REST api 请求?

    我们已经成功整合了使用 PayPal 登录 以前称为 PayPal Access https developer paypal com webapps developer docs integration direct log in wit
  • 如何从 gmtime() 的时间+日期输出中获取自纪元以来的秒数?

    你如何做反向gmtime 你把时间 日期放在哪里并获取秒数 我有像这样的字符串 Jul 9 2009 20 02 58 UTC 我想获取该纪元与 2009 年 7 月 9 日之间的秒数 我努力了time strftime但我不知道如何正确使
  • IllegalStateException:应用程序的 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged

    我正在使用ViewPager示例与ActionBar取自 Android 文档的选项卡here http developer android com reference android support v4 view ViewPager h
  • CouchDB复制忽略零星文档

    我的应用程序有一个 CouchDB 设置 CouchDB 2 1 1 它在很大程度上依赖于复制完整性 我们使用 每个用户一个数据库 方法 并附加一层 角色 db s 将用户分组 如下图所示 最近 在增加测试人员数量的同时 我们发现一些文档没
  • 为 dev_appserver 导入 python 模块的正确方法是什么?

    Intent 我正在为 App Engine 创建一个 CRUD 应用程序 其中用户通过 OAuth 进行身份验证 服务器将其访问和刷新令牌存储在数据存储区中 我正在进行本地测试dev appserver并陷入进退两难的境地 The pyt