Отказано в доступе в хранилище данных GAE? - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь узнать, как использовать Google App Engine, и я использую документацию QuickStart для Python здесь . Это простой код для записи меток времени в хранилище данных, а затем распечатки их обратно пользователю.

Я строго следую коду и шагам, но вместо облака я использую Cloud Shell и Cloud Console загрузка SDK и локальный запуск кода.

Первая половина кода работает отлично, и я могу развернуть веб-сервис. Однако когда я начинаю использовать хранилище данных, в моем приложении появляется 500 Internal Server Error. Полный main.py указан ниже. Я закомментировал разделы кода и понял, что проблема возникает при записи в хранилище данных. Журнал ошибок показывает ошибку PERMISSION DENIED (журнал ниже).

Из того, что я вижу, использование Cloud Shell должно означать, что аутентификация между моим python сценарием и хранилищем данных должна "просто работать", но, похоже, это не так. Я также использую точный код из документации Google, поэтому не понимаю, почему он должен выдавать ошибку.

Есть идеи, что я мог бы попробовать?

Вот мой 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 Отсутствует или недостаточно разрешений , в 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) в 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 / * 1037) * .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) в полном объеме l_dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1949) при ререйзе (/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/site-packages/flask/app.py:2446)

1 Ответ

2 голосов
/ 12 апреля 2020

Я использовал 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>)}>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...