【发布时间】:2020-04-12 17:00:35
【问题描述】:
我正在尝试学习如何使用 Google App Engine,我正在使用 Python here 的 QuickStart 文档。这是一个将时间戳写入数据存储区,然后将其打印回用户的简单代码。
我非常严格地遵循代码和步骤,但我使用的是 Cloud Shell 和 Cloud Console,而不是下载 SDK 并在本地运行代码。
代码的前半部分运行良好,我能够部署 Web 服务。但是,当我开始使用数据存储时,我的应用程序中会出现 500 Internal Server Error。下面提供了完整的main.py。我注释掉了部分代码,并发现在写入数据存储时问题似乎出现了。错误日志显示PERMISSION DENIED 错误(日志如下)。
据我所知,使用 Cloud Shell 应该意味着我的 python 脚本和数据存储之间的身份验证应该“正常工作”,但看起来它没有。我也在使用谷歌文档中的确切代码,所以我不明白为什么它会出错。
有什么我可以尝试的想法吗?
这是我的main.py:
import datetime
from flask import Flask, render_template
from google.cloud import datastore
datastore_client = datastore.Client()
app = Flask(__name__)
def store_time(dt):
entity = datastore.Entity(key=datastore_client.key('visit'))
entity.update({
'timestamp': dt
})
datastore_client.put(entity)
def fetch_times(limit):
query = datastore_client.query(kind='visit')
query.order = ['-timestamp']
times = query.fetch(limit=limit)
return times
@app.route('/')
def root():
store_time(datetime.datetime.now())
times = fetch_times(10)
return render_template(
'index.html', times=times)
错误日志显示如下错误:
文件“”,第 3 行,在 raise_from 中: google.api_core.exceptions.PermissionDenied:403 缺失或 权限不足。在error_remapped_callable (/env/lib/python3.7/site-packages/google/api_core/grpc_helpers.py:59) 在 func_with_timeout (/env/lib/python3.7/site-packages/google/api_core/timeout.py:214)在 重试目标 (/env/lib/python3.7/site-packages/google/api_core/retry.py:184)在 retry_wrapped_func (/env/lib/python3.7/site-packages/google/api_core/retry.py:286)在 调用 (/env/lib/python3.7/site-packages/google/api_core/gapic_v1/method.py:143) 提交时 (/env/lib/python3.7/site-packages/google/cloud/datastore_v1/gapic/datastore_client.py:571) 在 _commit (/env/lib/python3.7/site-packages/google/cloud/datastore/batch.py:250) 提交时 (/env/lib/python3.7/site-packages/google/cloud/datastore/batch.py:274) 在 put_multi (/env/lib/python3.7/site-packages/google/cloud/datastore/client.py:490) 在放 (/env/lib/python3.7/site-packages/google/cloud/datastore/client.py:463) 在 store_time (/srv/main.py:20) 在 root (/srv/main.py:36) 在 dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1935) 在 full_dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1949) 在 reraise (/env/lib/python3.7/site-packages/flask/_compat.py:39)在 处理用户异常 (/env/lib/python3.7/site-packages/flask/app.py:1820) 在 full_dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1951) 在 wsgi_app (/env/lib/python3.7/site-packages/flask/app.py:2446)
【问题讨论】:
-
请添加
app.yaml和requirements.txt -
minor:约定是将 Datastore 种类的第一个字母大写。所以
Visit而不是visit -
App Engine 对 Datastore 的访问权限由您项目的 default App Engine service account 上的权限控制。检查此服务帐号是否具有可以访问 Datastore 的角色。
标签: python python-3.x google-app-engine google-cloud-datastore gcloud