[英]What is the proper way import python modules for dev_appserver?
我正在為 App Engine 創建一個 CRUD 應用程序,用戶通過 OAuth 進行身份驗證,服務器將他們的訪問和刷新令牌存儲在 Datastore 中。 我正在使用dev_appserver
進行本地測試並陷入困境:
ndb
模塊,python27 運行google.auth
模塊。 在 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 運行時,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
在我的服務器文件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
。
ndb
ORM 庫不適用於 Python 3。您可以:
ndb
被移植到 Python 3。目前正在進行中,您可以在這里關注: https ://github.com/Googleapis/python-ndb不建議繼續使用 Python 2.7 運行時,因為 Python 2.7 將於 2020 年 1 月 1 日結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.