簡體   English   中英

為 dev_appserver 導入 python 模塊的正確方法是什么?

[英]What is the proper way import python modules for dev_appserver?

意圖

我正在為 App Engine 創建一個 CRUD 應用程序,用戶通過 OAuth 進行身份驗證,服務器將他們的訪問和刷新令牌存儲在 Datastore 中。 我正在使用dev_appserver進行本地測試並陷入困境:

  • python37 運行時無法導入 Datastore 的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與 Datastore 交互。 但是,我仍然有興趣解決下面概述的問題,以便更好地理解 python 模塊在 App Engine 中的工作方式。

蟒蛇27

在 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中,我將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。您可以:

  1. 通過 Cloud Datastore API 訪問Cloud Datastore 您可以使用Google Cloud 客戶端庫在 Cloud Datastore 中存儲和檢索數據。
  2. 等待ndb被移植到 Python 3。目前正在進行中,您可以在這里關注: https ://github.com/Googleapis/python-ndb

不建議繼續使用 Python 2.7 運行時,因為 Python 2.7 將於 2020 年 1 月 1 日結束。

對於第一代 GAE 標准環境(Python 2.7),應用程序處理依賴關系與常規 Python 應用程序略有不同。 盡量不要有創意,因為如果您遇到麻煩,將更難獲得幫助。

對於包含在 GAE 提供的第 3 方內置庫中的庫,您可以在app.yaml文件中請求它們

GAE 未提供的第三方庫(或您有意使用自己的版本/副本的庫)必須復制/出售到您的應用程序中。

只選擇一種方法,嘗試對同一個庫執行兩種方法也可能會造成麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM