Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GAE数据存储权限被拒绝?_Python_Python 3.x_Google App Engine_Google Cloud Datastore_Gcloud - Fatal编程技术网

Python GAE数据存储权限被拒绝?

Python GAE数据存储权限被拒绝?,python,python-3.x,google-app-engine,google-cloud-datastore,gcloud,Python,Python 3.x,Google App Engine,Google Cloud Datastore,Gcloud,我正在尝试学习如何使用GoogleAppEngine,并且正在使用Python的快速入门文档。将时间戳写入数据存储,然后将它们打印回用户,这是一个简单的代码 我非常严格地遵循代码和步骤,但我使用的是云Shell和云控制台,而不是下载SDK并在本地运行代码 代码的前半部分工作得很好,我能够部署web服务。但是,当我开始使用数据存储时,我的应用程序中出现500内部服务器错误。下面提供了完整的main.py。我注释了代码的各个部分,发现在写入数据存储时问题似乎出现了。错误日志显示权限被拒绝的错误(下面

我正在尝试学习如何使用GoogleAppEngine,并且正在使用Python的快速入门文档。将时间戳写入数据存储,然后将它们打印回用户,这是一个简单的代码

我非常严格地遵循代码和步骤,但我使用的是云Shell和云控制台,而不是下载SDK并在本地运行代码

代码的前半部分工作得很好,我能够部署web服务。但是,当我开始使用数据存储时,我的应用程序中出现
500内部服务器错误
。下面提供了完整的
main.py
。我注释了代码的各个部分,发现在写入数据存储时问题似乎出现了。错误日志显示权限被拒绝的
错误(下面的日志)

从我所看到的情况来看,使用云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行,从: google.api_core.exceptions.PermissionDenied:403缺失或 权限不足。错误时_重新映射_可调用 (/env/lib/python3.7/site packages/google/api_core/grpc_helpers.py:59) 在func_处,带_超时 (/env/lib/python3.7/site packages/google/api_core/timeout.py:214) 重试\u目标 (/env/lib/python3.7/site packages/google/api_core/retry.py:184) 重试\u包装\u函数 (/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) 至少 (/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) 在根目录(/srv/main.py:36)处的存储时间(/srv/main.py:20) 发送请求(/env/lib/python3.7/site packages/flask/app.py:1935) 按要求全速发送 (/env/lib/python3.7/site packages/flask/app.py:1949) (/env/lib/python3.7/site packages/flask/_compat.py:39)位于 处理用户异常 (/env/lib/python3.7/site packages/flask/app.py:1820) 完全调度请求 (/env/lib/python3.7/site packages/flask/app.py:1951)位于wsgi_应用程序 (/env/lib/python3.7/site packages/flask/app.py:2446)


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

创建:

PROJECT=[[YOUR-PROJECT]]
地区=[[YOUR-REGION]#美国西部2
gcloud app create--project=${project}--region=${region}
与:

app.yaml

runtime: python37
entrypoint: gunicorn -b :$PORT main:app
<!doctype html>
<html>
<head>
  <title>Test</title>
</head>
<body>

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

</body>
</html>
NB
入口点
是可选的,但我更喜欢显式的

requirements.txt

Flask==1.1.2
gunicorn==20.0.4
google-cloud-datastore==1.12.0
并使用示例模板:

模板/index.html

runtime: python37
entrypoint: gunicorn -b :$PORT main:app
<!doctype html>
<html>
<head>
  <title>Test</title>
</head>
<body>

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

</body>
</html>
然后浏览应用程序的端点:

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>)}>
访问:

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

创建:

PROJECT=[[YOUR-PROJECT]]
地区=[[YOUR-REGION]#美国西部2
gcloud app create--project=${project}--region=${region}
与:

app.yaml

runtime: python37
entrypoint: gunicorn -b :$PORT main:app
<!doctype html>
<html>
<head>
  <title>Test</title>
</head>
<body>

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

</body>
</html>
NB
入口点
是可选的,但我更喜欢显式的

requirements.txt

Flask==1.1.2
gunicorn==20.0.4
google-cloud-datastore==1.12.0
并使用示例模板:

模板/index.html

runtime: python37
entrypoint: gunicorn -b :$PORT main:app
<!doctype html>
<html>
<head>
  <title>Test</title>
</head>
<body>

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

</body>
</html>
然后浏览应用程序的端点:

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>)}>
访问:

请添加
app.yaml
requirements.txt
小调:惯例是将数据存储类型的第一个字母大写。因此,
Visit
而不是
Visit
appengine对数据存储的访问是由您的项目服务器上的权限控制的。检查此服务帐户是否具有可访问数据存储的角色。请添加
app.yaml
requirements.txt
minor:约定为数据存储类型的首字母大写。因此,
Visit
而不是
Visit
appengine对数据存储的访问是由您的项目服务器上的权限控制的。检查此服务帐户是否具有可以访问数据存储的角色。谢谢@DazWilkin。出于某种原因,这在我已经拥有的项目中不起作用(即使在做了您建议的更改之后),但在我创建并部署一个新项目时,它就像charmThanks@DazWilkin一样工作。出于某种原因,这在我已经拥有的项目中不起作用(即使在做了您建议的更改之后),但在我创建并部署一个新项目的那一刻,它就发挥了巨大的作用