0

我正在尝试学习如何使用 Google App Engine,并且我在这里使用 Python 的 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 缺少权限或权限不足。在 func_with_timeout (/env/lib/python3.7/site-packages/google/api_core/timeout.py: 214) 在 retry_target (/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) 在 put (/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) 在 handle_user_exception (/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/站点包/烧瓶/app.py:2446)

4

1 回答 1

2

我使用 Cloud Shell 并按原样获取您的代码。你的代码对我有用。

创建:

PROJECT=[[YOUR-PROJECT]]
REGION=[[YOUR-REGION]] # us-west2
gcloud app create --project=${PROJECT} --region=${REGION}

和:

app.yaml

runtime: python37
entrypoint: gunicorn -b :$PORT main:app

NB entrypoint是可选的,但我更喜欢明确

requirements.txt

Flask==1.1.2
gunicorn==20.0.4
google-cloud-datastore==1.12.0

并使用了示例模板:

templates/index.html

<!doctype html>
<html>
<head>
  <title>Test</title>
</head>
<body>

  <h2>Visits:</h2>
  {% for time in times %}
    <p>{{ time }}</p>
  {% endfor %}

</body>
</html>

和:

gcloud app deploy app.yaml --project=${PROJECT}

然后浏览应用程序的端点:

Visits:

<Entity('visit', 5079418695319552) {'timestamp': datetime.datetime(2020, 4, 12, 20, 20, 29, 417656, tzinfo=<UTC>)}>
<Entity('visit', 5702893864747008) {'timestamp': datetime.datetime(2020, 4, 12, 20, 16, 28, 305081, tzinfo=<UTC>)}>
<Entity('visit', 5636645067948032) {'timestamp': datetime.datetime(2020, 4, 12, 20, 16, 26, 495333, tzinfo=<UTC>)}>
<Entity('visit', 5642368648740864) {'timestamp': datetime.datetime(2020, 4, 12, 20, 16, 22, 369022, tzinfo=<UTC>)}>
<Entity('visit', 5632499082330112) {'timestamp': datetime.datetime(2020, 4, 12, 20, 16, 20, 659993, tzinfo=<UTC>)}>
于 2020-04-12T20:32:38.910 回答