GAE TaskQueue: пример кода для доступа к очереди извне из App Engine? - PullRequest
2 голосов
/ 06 августа 2011

Я пытаюсь использовать REST API GAE TaskQueue для перетаскивания задач из очереди на внешний сервер (сервер не в GAE).

  • Есть ли библиотека, которая делает этодля меня?

  • API достаточно прост, поэтому мне просто нужно выяснить аутентификацию.Я изучил запрос, отправленный gtaskqueue_sample с google-api-python-client с использованием --dump_request и нашел заголовок authorization: OAuth XXX.Добавление этого токена к моему собственному запросу сработало, но токен, кажется, периодически истекает (возможно, ежедневно), и я не могу понять, как его заново сгенерировать.В связи с этим сам gtaskqueue_sample больше не работает (вызов https://accounts.google.com/o/oauth2/token завершается с No JSON object could be decoded).

Как заботиться об аутентификации?Это серверное приложение, поэтому в идеале я мог бы генерировать токен, который мог бы использовать с тех пор.

Ответы [ 3 ]

4 голосов
/ 22 октября 2013

Этот вопрос старый, но он все еще применяется, поэтому я попытаюсь найти лучший ответ, основываясь на моем недавнем опыте.

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

Перед тем как идти по этому маршруту, у вас также есть возможность развернуть собственную защиту и сделать простую веб-оболочку длявызовы appengine taskqueue.Я испытал желание пойти по этому пути после того, как столкнулся с этим, но так как это работает, я использую его сейчас.

Настройка вашей машины

Настройка учетной записи

  • Используя Google Cloud Console , создайте зарегистрированное приложение (если у вас его еще нет. Нажмите на свой проект AppEngine -> API и auth -> Зарегистрированные приложения. Вы можете ввестиимя и тип приложения, а затем примите значения по умолчанию. Как только оно будет создано, запишите Client Id и Client Secret для дальнейшего использования.

  • Также обновите свой экран согласия (API и auth -> Consent)Экран.) Обратите внимание, что этот экран согласия вам понадобится только для первоначальной настройки учетных данных oauth. Вам нужно будет ввести адрес электронной почты и название продукта (я также ввел URL-адрес HomePage).

Создание учетных данных OAuth

  • Вам необходимо создать файл учетных данных только один раз, тогда он будет использоваться для будущих вызовов в вашем скрипте python.Запустите этот код Python, который открывает браузер и создает файл учетных данных.Ссылка для этого кода: здесь .

    from oauth2client.tools import run
    from oauth2client.client import OAuth2WebServerFlow
    from oauth2client.file import Storage
    import gflags
    FLAGS = gflags.FLAGS
    
    storage = Storage('credentials.json')
    
    flow = OAuth2WebServerFlow(client_id='<your_client_id>',
                           client_secret='<your_client_secret>',
                           scope='https://www.googleapis.com/auth/taskqueue',
                           redirect_uri='urn:ietf:wg:oauth:2.0:oob')
    
    credentials = run(flow, storage )
    

Выполните вызовы в очереди задач

  • Убедитесь, что вы добавили очередь извлечения в свой AppEngine queue.yaml , с адресом электронной почты, который вы использовали в шаге oauth выше.

    from oauth2client.tools import run
    from oauth2client.client import OAuth2WebServerFlow
    from oauth2client.file import Storage
    from apiclient.discovery import build
    import httplib2
    
    storage = Storage('credentials.json')
    credentials = storage.get()
    http = httplib2.Http()
    http = credentials.authorize(http)
    task_api = build('taskqueue', 'v1beta2')
    tasks = task_api.tasks().lease(project='<your appengine project>',taskqueue='<pull queue name>', numTasks=1, leaseSecs=600).execute(http=http)
    task = tasks['items'][0]
    payload = task['payloadBase64']
    payload = base64.b64decode(payload)
    
    #then do your work and delete the task when done
    
    task_api.tasks().delete(project='s~<your appengine project>',taskqueue='<pull queue name>', task=task['id']).execute(http=http)
    
  • ЗадачаОчередь Справочник по API

  • Обратите внимание на префикс '~' перед именем проекта в вызове удаления.Это будет работать, только если я добавлю это, и я считаю, что это ошибка .

Обновление 7/1 / 2014

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

Настройка устройства

Настройка учетной записи

  • Используя Google Cloud Console , создайте зарегистрированное приложение (если у вас его еще нет. Нажмите на свой проект AppEngine -> API & Auth -> Учетные данные. Нажмите Создать новый идентификатор клиента, укажите учетную запись службызатем нажмите «Создать идентификатор клиента». Появится окно загрузки для загрузки вашего закрытого ключа, сохраните его в каталоге кода (или там, где я сохранил как client_key.p12). В веб-интерфейсе запишите идентификатор клиента и адрес электронной почты.

Заменить учетный код сверху

from oauth2client.client import SignedJwtAssertionCredentials

email = '<***>.gserviceaccount.com'
f = file('client_key.p12', 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(email,
                                            key,
                                            scope='https://www.googleapis.com/auth/taskqueue')
1 голос
/ 30 декабря 2011

Эти APIS работают только для сервера GAE, поскольку очереди могут создаваться только через queue.yaml, а infact API не предоставляет никаких API для вставки очереди и задач или проекта.

0 голосов
/ 08 августа 2011

Страница очередей извлечения содержит целый раздел о клиентских библиотеках и примерах кода.

...