appcfg.py показывает, что вы должны войти в систему как администратор

Когда я пытаюсь загрузить образец данных CSV в мое приложение GAE через appcfg.py, это показывает ошибку ниже 401.

2015-11-04 10:44:41,820 INFO client.py:571 Refreshing due to a 401 (attempt 2/2) 
2015-11-04 10:44:41,821 INFO client.py:797 Refreshing access_token 

Error 401: --- begin server output ---
You must be logged in as an administrator to access this.
--- end server output ---

Вот команда, которую я пробовал,

appcfg.py upload_data --application=dev~app --url=http://localhost:8080/_ah/remote_api --filename=data/sample.csv

5 ответов

Решение

Вот как мы это делаем, чтобы использовать пользовательскую аутентификацию.

Пользовательский обработчик в app.yaml

- url: /remoteapi.*
  script: remote_api.app

Пользовательское приложение wsgi в remote_api.py для переопределения CheckIsAdmin

from google.appengine.ext.remote_api import handler
from google.appengine.ext import webapp
import re

MY_SECRET_KEY = 'MAKE UP PASSWORD HERE'  # make one up, use the same one in the shell command
cookie_re = re.compile('^"?([^:]+):.*"?$')


class ApiCallHandler(handler.ApiCallHandler):
    def CheckIsAdmin(self):
        """Determine if admin access should be granted based on the
           auth cookie passed with the request."""
        login_cookie = self.request.cookies.get('dev_appserver_login', '')
        match = cookie_re.search(login_cookie)
        if (match and match.group(1) == MY_SECRET_KEY
            and 'X-appcfg-api-version' in self.request.headers):
            return True
        else:
            self.redirect('/_ah/login')
            return False


app = webapp.WSGIApplication([('.*', ApiCallHandler)])

Отсюда мы пишем сценарий загрузки данных, которые были экспортированы из нашего живого приложения. Используйте тот же пароль, который вы создали в скрипте Python выше.

echo "MAKE UP PASSWORD HERE" | appcfg.py upload_data --email=some@example.org --passin --url=http://localhost:8080/remoteapi --num_threads=4 --kind=WebHook --filename=webhook.data --db_filename=bulkloader-progress-webhook.sql3

WebHook а также webhook.data специфичны для Kind что мы экспортировали с производства.

У меня была похожая проблема, где appcfg.py не давал мне никаких учетных данных, поэтому я не мог пройти проверку подлинности. Я опустил версию с GAELauncher 1.27 до 1.26, и аутентификация снова начала работать.

Временное решение: перейдите на страницу https://console.developers.google.com/storage/browser/appengine-sdks/featured/ чтобы получить версию 1.9.26.

Отправленный отчет об ошибке: https://code.google.com/p/google-cloud-sdk/issues/detail?id=340

Вы не можете использовать appcfg.py upload_data команда с сервером разработки [edit: как есть; см. ответ Джоша Дж.] Работает только с remote_api конечная точка работает на App Engine и аутентифицируется с помощью OAuth2.

Простой способ загрузить данные в хранилище данных сервера dev - это создать конечную точку, которая читает файл CSV и создает соответствующие объекты хранилища данных, а затем отправляет их в браузер. (Обязательно удалите конечную точку перед развертыванием приложения или ограничьте доступ к URL-адресу с помощью login: admin.)

У вас должен быть токен для учетной записи Google, которая не является администратором этого проекта. Попробуйте передать --no_cookies флаг, чтобы он снова запросил аутентификацию.

Может быть, это как-то связано с этим? Из документов

Подключение вашего приложения к локальному серверу разработки

Чтобы использовать локальный сервер разработки для вашего приложения, работающего локально, вам необходимо сделать следующее:

Установите переменные среды. Добавьте или измените код подключения хранилища данных вашего приложения. Установка переменных среды

Создайте переменную среды DATASTORE_HOST и задайте для нее хост и порт, которые прослушивает локальный сервер разработки. Хост и порт по умолчанию - http://localhost:8080/. (Примечание. Если вы используете аргументы командной строки port и / или host для изменения этих значений по умолчанию, обязательно измените DATASTORE_HOST соответствующим образом.) В следующем примере оболочки bash показано, как установить эту переменную:

export DATASTORE_HOST = http://localhost:8080/ Создайте переменную среды с именем DATASTORE_DATASET и задайте для нее идентификатор набора данных, как показано в следующем примере оболочки bash:

export DATASTORE_DATASET = Примечание. Клиентские библиотеки Python и Java ищут переменные среды DATASTORE_HOST и DATASTORE_DATASET.

Ссылка на документы

https://cloud.google.com/datastore/docs/tools/devserver

Другие вопросы по тегам