Python - HTTP-объект POST 'Response' не поддерживает индексирование - PullRequest
0 голосов
/ 06 января 2019

У меня есть код ниже в Python3, который получает запрос POST. Пример запроса показан позже.

Я вижу, что запрос POST идет правильно. Данные JSON, поступающие через POST, имеют 2 ключа - "id" и "ingredients". Но когда я пытаюсь получить доступ к данным, основанным на ключах, например content ["id"], как показано ниже, он показывает ошибку

TypeError: объект «Response» не может быть подписан

Код:

@app.route('/cuisine/api/json',methods=['POST'])
def getCuisine():
    content = jsonify(request.json)
    return content["id"]

Пример CURL

curl --header "Content-Type: application/json"   --request POST   --data '{"id": 10259,"ingredients": ["romaine lettuce","black olives","grape tomatoes","garlic","pepper","purple onion","seasoning","garbanzo beans","feta cheese crumbles"]}'   http://127.0.0.1:5000/cuisine/api/json

Кажется, я следовал этому посту правильно, но не работает. Чего мне не хватает?

EDIT

Полная трассировка ошибок

Traceback (most recent call last):
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/MacUser/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/MacUser/Desktop/cuisine-prediction/webservice.py", line 62, in getCuisine
    return content["id"]
TypeError: 'Response' object is not subscriptable

Ответы [ 2 ]

0 голосов
/ 06 января 2019

jsonify преобразует объект Python в ответ Flask с полезной нагрузкой JSON. Итак, вы берете проанализированные данные (которые являются Python-диктатом) из запроса и конвертируете их обратно в JSON. Вы должны использовать request.json напрямую, чтобы получить свои данные.

@app.route('/cuisine/api/json',methods=['POST'])
def getCuisine():
    return jsonify(request.json["id"])
0 голосов
/ 06 января 2019

Вы не можете вызвать jsonify для request.json, а затем использовать этот объект в качестве словаря. Вызов request.json попытается вернуть словарь из JSON.

Так что ваши шаги назад, как:

return jsonify(request.json.get(‘id’))

Но настоящая причина вашей проблемы в том, что jsonify создает объект HTTP Response, который не является простым словарем, о котором вы думаете.

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