Localhost: как получить учетные данные для подключения приложения GAE Python 3 и эмулятора Datastore? - PullRequest
0 голосов
/ 03 февраля 2019

Я бы хотел использовать новый эмулятор Datastore вместе с приложением GAE Flask на localhost .Я хочу запустить его в среде Docker, но ошибка, которую я получаю (DefaultCredentialsError), происходит с Docker или без него.

Мой файл Flask выглядит следующим образом ( см. Весь репозиторий здесь, на GitHub ):

main.py:

from flask import Flask
from google.cloud import datastore


app = Flask(__name__)


@app.route("/")
def index():
    return "App Engine with Python 3"


@app.route("/message")
def message():
    # auth
    db = datastore.Client()

    # add object to db
    entity = datastore.Entity(key=db.key("Message"))
    message = {"message": "hello world"}
    entity.update(message)
    db.put(entity)

    # query from db
    obj = db.get(key=db.key("Message", entity.id))

    return "Message for you: {}".format(obj["message"])

Обработчик index() работает нормально, но обработчик message() выдает эту ошибку:

[2019-02-03 20:00:46,246] ERROR in app: Exception on /message [GET]
Traceback (most recent call last):
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/app/main.py", line 16, in message
    db = datastore.Client()
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/google/cloud/datastore/client.py", line 210, in __init__
    project=project, credentials=credentials, _http=_http
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/google/cloud/client.py", line 223, in __init__
    _ClientProjectMixin.__init__(self, project=project)
INFO     2019-02-03 20:00:46,260 module.py:861] default: "GET /message HTTP/1.1" 500 291
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/google/cloud/client.py", line 175, in __init__
    project = self._determine_default(project)
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/google/cloud/datastore/client.py", line 228, in _determine_default
    return _determine_default_project(project)
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/google/cloud/datastore/client.py", line 75, in _determine_default_project
    project = _base_default_project(project=project)
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/google/cloud/_helpers.py", line 186, in _determine_default_project
    _, project = google.auth.default()
  File "/tmp/tmpJcIw2U/lib/python3.5/site-packages/google/auth/_default.py", line 306, in default
    raise exceptions.DefaultCredentialsError(_HELP_MESSAGE)
google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application. For more information, please see https://cloud.google.com/docs/authentication/getting-started

Я проверил веб-сайт в журнале ошибок и попробовал файл аутентификации JSON (GOOGLE_APPLICATION_CREDENTIALS), но в результате мое приложение подключилось к хранилищу данных production в Google Cloud вместо этого.локального эмулятора Datastore.

Есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 04 февраля 2019

Тот факт, что требуются учетные данные, указывает на то, что вы обращаетесь к реальному хранилищу данных, а не к эмулятору хранилища данных (который не требует и не запрашивает учетные данные).

Для доступа к эмулятору клиентские приложения (которые его поддерживают)) нужно выяснить, где эмулятор слушает, и для этого вам нужно установить переменную окружения DATASTORE_EMULATOR_HOST для них.От Установка переменных среды :

После запуска эмулятора необходимо установить переменные среды, чтобы приложение подключалось к эмулятору вместо рабочей среды режима хранилища данных.Установите эти переменные среды на том же компьютере, который вы используете для запуска приложения.

Вам необходимо устанавливать переменные среды каждый раз, когда вы запускаете эмулятор.Переменные среды зависят от динамически назначаемых номеров портов, которые могут измениться при перезапуске эмулятора.

Подробнее о настройке среды см. В остальной части этого раздела и, возможно, посмотрите на Возможно линачать два dev_appserver.py подключения к одному и тому же эмулятору хранилища данных облака Google?

...