GCP-The App Engine APIs are not available, with py 3
GCP-The App Engine APIs are not available, with py 3
我正在尝试使用具有域范围授权的服务帐户从 App Engine 使用 Admin SDK API,允许它模拟管理员。
我找到了几个这样做的指南,但没有一个能像我预期的那样工作。
以下代码已部署到 App Engine 标准中。
main.py
from flask import Flask
from google.auth import app_engine
import google.auth
try:
import googleclouddebugger
googleclouddebugger.enable()
except ImportError:
pass
SCOPES = ['https://www.googleapis.com/auth/admin.directory.user']
app = Flask(__name__)
@app.route('/')
def hello():
credentials, project = google.auth.default()
appIdentity = app_engine.app_identity
credentials = app_engine.Credentials(scopes=SCOPES)
ret = "Expired:{}".format(credentials.expired)
ret += "\nvalid:{}".format(credentials.valid)
return 'Hello World!\n'+ret
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8080, debug=True)
app.yaml
runtime: python37
代码 credentials = app_engine.Credentials(scopes=SCOPES)
将导致应用程序出现 500 错误消息,因为 app_engine.app_identity
始终是 none
。
"Traceback (most recent call last):
File "/env/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/env/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/env/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/env/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/env/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/env/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/srv/main.py", line 52, in hello
credentials = app_engine.Credentials(scopes=SCOPES)
File "/env/lib/python3.7/site-packages/google/auth/app_engine.py", line 107, in __init__
'The App Engine APIs are not available.')
OSError: The App Engine APIs are not available."
如您所见,报错The App Engine APIs are not available
但GCP项目中没有API同名。
下面是我在项目中启用的所有 APIs,试图实现它所要求的。当然,错误还是会出现。
这是一个测试环境,如果有人需要访问,请询问,我很乐意为您授予 GCP 项目的查看权限
感谢您的宝贵时间:)
您使用的 python37 运行时(第二代标准环境)与应用程序引擎 API 不兼容(只有 python27/1st 第一代兼容)。来自 Understanding differences between the Python 2 and Python 3 environments:
Proprietary App Engine APIs are not available in Python 3. This
section lists recommended replacements.
from google.auth import app_engine
实际上无法使用,因为它们基于 App Identity API,其中一个是专有的。
要在 python37 运行时进行身份验证,请遵循 Granting your app access to Cloud services 部分。基本上不同于 App Identity API,您在其中调用 Credentials()
一次,然后使用应用程序身份访问服务,在 python37 中,您使用相应的服务 [=34] 对您需要的每项服务进行身份验证=] Client()
调用(或等效):
# If you don't specify credentials when constructing the client, the
# client library will look for credentials in the environment.
storage_client = storage.Client()
如果您要使用的服务帐户不是应用程序的默认服务帐户,那么您需要指定它:
You can override this default flow by doing any of the following:
Set the GOOGLE_APPLICATION_CREDENTIALS
environment variable. If this variable is set, Cloud services use the credentials specified by
the variable instead of the default service account.
Specify credentials when you instantiate the Client
object for a Cloud service. For example, if your app is calling a Cloud service in
a different project, you may need to pass credentials manually.
我正在尝试使用具有域范围授权的服务帐户从 App Engine 使用 Admin SDK API,允许它模拟管理员。
我找到了几个这样做的指南,但没有一个能像我预期的那样工作。
以下代码已部署到 App Engine 标准中。
main.py
from flask import Flask
from google.auth import app_engine
import google.auth
try:
import googleclouddebugger
googleclouddebugger.enable()
except ImportError:
pass
SCOPES = ['https://www.googleapis.com/auth/admin.directory.user']
app = Flask(__name__)
@app.route('/')
def hello():
credentials, project = google.auth.default()
appIdentity = app_engine.app_identity
credentials = app_engine.Credentials(scopes=SCOPES)
ret = "Expired:{}".format(credentials.expired)
ret += "\nvalid:{}".format(credentials.valid)
return 'Hello World!\n'+ret
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8080, debug=True)
app.yaml
runtime: python37
代码 credentials = app_engine.Credentials(scopes=SCOPES)
将导致应用程序出现 500 错误消息,因为 app_engine.app_identity
始终是 none
。
"Traceback (most recent call last):
File "/env/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/env/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/env/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/env/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/env/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/env/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/srv/main.py", line 52, in hello
credentials = app_engine.Credentials(scopes=SCOPES)
File "/env/lib/python3.7/site-packages/google/auth/app_engine.py", line 107, in __init__
'The App Engine APIs are not available.')
OSError: The App Engine APIs are not available."
如您所见,报错The App Engine APIs are not available
但GCP项目中没有API同名。
下面是我在项目中启用的所有 APIs,试图实现它所要求的。当然,错误还是会出现。
这是一个测试环境,如果有人需要访问,请询问,我很乐意为您授予 GCP 项目的查看权限
感谢您的宝贵时间:)
您使用的 python37 运行时(第二代标准环境)与应用程序引擎 API 不兼容(只有 python27/1st 第一代兼容)。来自 Understanding differences between the Python 2 and Python 3 environments:
Proprietary App Engine APIs are not available in Python 3. This section lists recommended replacements.
from google.auth import app_engine
实际上无法使用,因为它们基于 App Identity API,其中一个是专有的。
要在 python37 运行时进行身份验证,请遵循 Granting your app access to Cloud services 部分。基本上不同于 App Identity API,您在其中调用 Credentials()
一次,然后使用应用程序身份访问服务,在 python37 中,您使用相应的服务 [=34] 对您需要的每项服务进行身份验证=] Client()
调用(或等效):
# If you don't specify credentials when constructing the client, the # client library will look for credentials in the environment. storage_client = storage.Client()
如果您要使用的服务帐户不是应用程序的默认服务帐户,那么您需要指定它:
You can override this default flow by doing any of the following:
Set the
GOOGLE_APPLICATION_CREDENTIALS
environment variable. If this variable is set, Cloud services use the credentials specified by the variable instead of the default service account.Specify credentials when you instantiate the
Client
object for a Cloud service. For example, if your app is calling a Cloud service in a different project, you may need to pass credentials manually.