Python - HTTP POST 'Response' 对象不可订阅
Python - HTTP POST 'Response' object is not subscript-able
我在 Python3 中有以下代码接收 POST 请求。稍后显示的示例请求。
我看到 POST 请求正常。来自 POST 的 JSON 数据有 2 个键 - "id"
和 "ingredients"
。但是当我尝试基于密钥访问数据时,例如如下所示的内容["id"],它显示错误
TypeError: 'Response' object is not subscriptable
代码:
@app.route('/cuisine/api/json',methods=['POST'])
def getCuisine():
content = jsonify(request.json)
return content["id"]
卷曲示例
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
我想我正确地遵循了 但没有用。我错过了什么?
编辑
完整的错误回溯
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
您不能在 request.json 上调用 jsonify
,然后将该对象用作字典。调用 request.json
将尝试 return 来自 JSON.
的字典
所以你的后退步骤如下:
return jsonify(request.json.get(‘id’))
但问题的真正原因是 jsonify
创建了一个 HTTP 响应对象,它不是您认为的简单字典。
jsonify
将 Python 对象转换为具有 JSON 负载的 Flask 响应。因此,您从请求中获取已解析的数据(这是一个 Python 字典)并将其转换回 JSON。您应该直接使用 request.json
来获取数据。
@app.route('/cuisine/api/json',methods=['POST'])
def getCuisine():
return jsonify(request.json["id"])
我在 Python3 中有以下代码接收 POST 请求。稍后显示的示例请求。
我看到 POST 请求正常。来自 POST 的 JSON 数据有 2 个键 - "id"
和 "ingredients"
。但是当我尝试基于密钥访问数据时,例如如下所示的内容["id"],它显示错误
TypeError: 'Response' object is not subscriptable
代码:
@app.route('/cuisine/api/json',methods=['POST'])
def getCuisine():
content = jsonify(request.json)
return content["id"]
卷曲示例
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
我想我正确地遵循了
编辑
完整的错误回溯
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
您不能在 request.json 上调用 jsonify
,然后将该对象用作字典。调用 request.json
将尝试 return 来自 JSON.
所以你的后退步骤如下:
return jsonify(request.json.get(‘id’))
但问题的真正原因是 jsonify
创建了一个 HTTP 响应对象,它不是您认为的简单字典。
jsonify
将 Python 对象转换为具有 JSON 负载的 Flask 响应。因此,您从请求中获取已解析的数据(这是一个 Python 字典)并将其转换回 JSON。您应该直接使用 request.json
来获取数据。
@app.route('/cuisine/api/json',methods=['POST'])
def getCuisine():
return jsonify(request.json["id"])