Вызов облачной функции Google из представления Django - PullRequest
0 голосов
/ 19 октября 2019

Я создал функцию Google Cloud, которую можно вызывать через HTTP. Доступ к функции ограничен только учетной записью Сервиса.

Если бы у меня был Django View, который должен вызывать эту функцию и ожидать ответа?

Вот что я пробовал

1) Перед запуском Django я установил переменную среды

export GOOGLE_APPLICATION_CREDENTIALS

2) Я пытался вызвать функцию, используя автономный код, но вскоре понял, что это ни к чему не приведет, потому что я не мог понять следующий шаг после этого.

from google.oauth2 import service_account
from apiclient.http import call

SCOPES = ['https://www.googleapis.com/auth/cloud-platform']
SERVICE_ACCOUNT_FILE = 'credentials/credentials.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

Документация Google дает вам документацию по API, но нет примера кода о том, как вызывать методы или что импортировать в вашем коде Python, и каковы способы вызова этих методов.

Как отправить запрос POST с данными JSON в облачную функцию с авторизацией через учетную запись службы?

** Править Пару часов спустя я провел еще несколько копаний и понял эточастично

from google.oauth2 import service_account

import googleapiclient.discovery
import json
SCOPES = ['https://www.googleapis.com/auth/cloud-platform']
SERVICE_ACCOUNT_FILE = 'credentials/credentials.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

cloudfunction = googleapiclient.discovery.build('cloudfunctions', 'v1', credentials=credentials)
#projects/{project_id}/locations/{location_id}/functions/{function_id}.
path='some project path'
data='some data in json that works when invoked through the console'
data=json.dumps(data)
a=cloudfunction.projects().locations().functions().call(name=path, body=data).execute()

Теперь я получаю еще одну ошибку.

 Details: "[{'@type': 'type.googleapis.com/google.rpc.BadRequest', 'fieldViolations': [{'description': 'Invalid JSON payload received. Unknown name "": Root element must be a message.'}]}]">

Не могу найти никакой документации по этому вопросу. Как должен формироваться JSON?

, что делает JSON вроде {"message":{my actual payload}} не работающим.

1 Ответ

1 голос
/ 24 октября 2019

Запрошенную документацию можно найти здесь .

Аргументом тела запроса должен быть объект со следующей формой:

{ # Request for the `CallFunction` method.
    "data": "A String", # Input to be passed to the function.
}

Следующее изменение в вашемкод должен работать правильно:

from google.oauth2 import service_account
import googleapiclient.discovery

SCOPES = ['https://www.googleapis.com/auth/cloud-platform']
SERVICE_ACCOUNT_FILE = 'credentials/credentials.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

cloudfunction = googleapiclient.discovery.build('cloudfunctions', 'v1', credentials=credentials)
path ="projects/your-project-name/locations/cloud-function-location/functions/name-of-cloud-function"
data = {"data": "A String"}
a=cloudfunction.projects().locations().functions().call(name=path, body=data).execute()

Обратите внимание, что разрешен очень ограниченный трафик, поскольку для вызовов API существует ограничение .

...