dev_appserver не будет использовать мой index.yaml python3 .7 - PullRequest
0 голосов
/ 19 июня 2020

Я в процессе обновления приложения python2 .7 gae std до python3 .7. Все отлично, за исключением того, что мои индексы просто не работают.

У меня есть простой на вид файл index.yaml:

indexes:

- kind: Response
  ancestor: yes
  properties:
  - name: __key__
    direction: desc

И когда я запускаю определенные команды, я получаю это

google.api_core.exceptions.FailedPrecondition: 400 no matching index found. recommended index is:
- kind: Response
  ancestor: yes
  properties:
  - name: __key__
    direction: desc

Я использую команду для запуска dev_appserver: dev_appserver.py --application=my_project_id app.yaml. Мой файл index.yaml находится в том же каталоге, что и мой файл app.yaml.

Больше ничего не запущено. Само приложение - это Flask api, ошибка вылезает когда я curl одна из конечных точек.

То, что пробовал

после тыка вокруг документов и SO, кажется, мне может потребоваться запустить эмулятор хранилища данных локально. Итак, убедитесь, что мои компоненты gcloud обновлены:

gcloud beta emulators datastore env-init

# which gave me:

export DATASTORE_DATASET=firestore-datastore-280307
export DATASTORE_EMULATOR_HOST=::1:8608
export DATASTORE_EMULATOR_HOST_PATH=::1:8608/datastore
export DATASTORE_HOST=http://::1:8608
export DATASTORE_PROJECT_ID=firestore-datastore-280307

# then

gcloud beta emulators datastore start --project=my_project_id

# which gave me 

stuff...

[datastore] API endpoint: http://::1:8679
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore] 
[datastore]   export DATASTORE_EMULATOR_HOST=::1:8679
[datastore] 
[datastore] Dev App Server is now running.

Итак, объединяя эти выходные данные, похоже, что моя среда должна быть такой:

export DATASTORE_DATASET=my_project_id
export DATASTORE_EMULATOR_HOST=::1:8679
export DATASTORE_EMULATOR_HOST_PATH=::1:8679/datastore
export DATASTORE_HOST=http://::1:8679
export DATASTORE_PROJECT_ID=my_project_id

Cool. Поэтому я оставляю эмулятор запущенным и пытаюсь подключить к нему свой dev_appserver:

export DATASTORE_DATASET=my_project_id
export DATASTORE_EMULATOR_HOST=::1:8679
export DATASTORE_EMULATOR_HOST_PATH=::1:8679/datastore
export DATASTORE_HOST=http://::1:8679
export DATASTORE_PROJECT_ID=my_project_id
dev_appserver.py --application=my_project_id app.yaml

Он запускается, но когда я curl моя конечная точка, я получаю ту же ошибку индекса.

Итак, я убиваю dev_appserver и пробую это так:

# same env vars as before
dev_appserver.py --support_datastore_emulator=true --application=my_project_id app.yaml

Затем я получаю новую ошибку:

RuntimeError: Cannot use the Cloud Datastore Emulator because the packaged grpcio is incompatible to this system. Please install grpcio using pip

Я установил grpcio в python2 .7 env, чтобы получить над этой ошибкой. Теперь вроде все работает. Но я все еще получаю ошибку отсутствующего индекса.

И еще одна странная вещь: если я go на http://localhost:8000 и попытаюсь перейти к чему-нибудь, что связано с хранилищами данных, я получу такие ошибки, как:

ConnectionError: Cannot connect to Cloud Datastore Emulator on ::1:{THE_PORT}

Что очень странно.

Думаю вернуться к 2.7.

1 Ответ

1 голос
/ 19 июня 2020

Не go назад к 2.7! Если у вас возникла эта проблема в производственной среде, введите go в консоль разработчика и проверьте свои индексы: https://console.cloud.google.com/..... Посмотрите, строятся ли они еще. Для построения индексов требуется некоторое время.

Если это происходит только в процессе разработки:

dev_appserver содержит ошибки в Windows. Я не мог сказать, были вы на Windows или нет. У меня были проблемы с использованием dev_appserver в виртуальной среде даже на Ma c при переносе приложения на Python 3.7.

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

cd /Users/myname/venv37
source ./bin/activate
export FLASK_APP=/Users/myname/path_to_app
FLASK_ENV=development flask run --port 5000

изменить:

ndb несовместимо с python 3.7. Они разработали новую службу Google Cloud NDB, которая позволяет использовать старые данные ndb: https://cloud.google.com/appengine/docs/standard/python3/migrating-to-cloud-ndb

Новые приложения должны использовать Cloud Datastore или Firestore. Но устаревшие приложения ndb можно перенести в Google Cloud NDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...