AWS Чаша, не могу получить изображение из запроса POST - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь вызвать мою модель мудреца, используя aws чашу, лямбда-функцию и API Gateaway.

Я пытаюсь отправить изображение по запросу POST, но я возникли проблемы при получении его по лямбда-функции.

Мой код выглядит так:

from chalice import Chalice
from chalice import BadRequestError
import base64
import os
import boto3
import ast
import json

app = Chalice(app_name='foo')
app.debug = True


@app.route('/', methods=['POST'], content_types=['application/json'])
def index():
    body = ''

    try:
        body = app.current_request.json_body # <- I suspect this is the problem
        return {'response': body}
    except Exception as e:
        return  {'error':  str(e)}

Он просто возвращает

<Response [200]> {'error': 'BadRequestError: Error Parsing JSON'}

Как я уже говорил раньше моя конечная цель - получить мое изображение и сделать с ним запрос мудреца. Но я просто не могу прочитать изображение.

Мой python тестовый клиент выглядит так:

import base64, requests, json

def test():

    url = 'api_url_from_chalice'
    body = ''

    with open('b1.jpg', 'rb') as image:
        f = image.read()
        body = base64.b64encode(f)

    payload = {'data': body}
    headers = {'Content-Type': 'application/json'}

    r = requests.post(url, data=payload, headers=headers)
    print(r)
    r = r.json()
    # r = r['response']

    print(r)

test()

Пожалуйста, помогите мне, я потратил много времени, пытаясь выяснить это

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Так что я смог понять это с помощью инженера aws (мне повезло, я полагаю). Я включаю полную лямбда-функцию. На клиенте ничего не изменилось.

from chalice import Chalice
from chalice import BadRequestError
import base64
import os
import boto3
import ast
import json
import sys


from chalice import Chalice
if sys.version_info[0] == 3:
    # Python 3 imports.
    from urllib.parse import urlparse, parse_qs
else:
    # Python 2 imports.
    from urlparse import urlparse, parse_qs

app = Chalice(app_name='app_name')
app.debug = True


@app.route('/', methods=['POST'])
def index():
    parsed = parse_qs(app.current_request.raw_body.decode())

    body = parsed['data'][0]
    print(type(body))

    try:
        body = base64.b64decode(body)
        body = bytearray(body)
    except e:
        return {'error': str(e)}


    endpoint = "object-detection-endpoint_name"
    runtime = boto3.Session().client(service_name='sagemaker-runtime', region_name='us-east-2')

    response = runtime.invoke_endpoint(EndpointName=endpoint, ContentType='image/jpeg', Body=body)

    print(response)
    results = response['Body'].read().decode("utf-8")
    results = results['predictions']

    results = json.loads(results)
    results = results['predictions']

    return {'result': results}
0 голосов
/ 30 марта 2020

Это сообщение об ошибке связано с тем, что вы не отправляете тело JSON в ваше приложение Chalice. Один из способов проверить это - использовать свойство .raw_body для подтверждения:

@app.route('/', methods=['POST'], content_types=['application/json'])
def index():
    body = ''

    try:
        #body = app.current_request.json_body # <- I suspect this is the problem
        return {'response': app.current_request.raw_body.decode()}
    except Exception as e:
        return  {'error':  str(e)}

Вы увидите, что тело закодировано в форме, а не JSON.

$ python client.py
<Response [200]>
{'response': 'data=c2FkZmFzZGZhc2RmYQo%3D'}
* 1007. * Чтобы исправить это, вы можете использовать параметр json в вызове requests.post():
    r = requests.post(url, json=payload, headers=headers)

Затем мы можем подтвердить, что в вашем приложении для чаши мы получили тело JSON:

$ python client.py
<Response [200]>
{'response': '{"data": "c2FkZmFzZGZhc2RmYQo="}'}
...