Flask Restful PUT 对象更新列表
Flask Restful PUT update list with object
我想使用 Flask Restful 使用 PUT 请求更新包含对象的列表。
结果 JSON 应如下所示:
{"EmployeeID":"12345", "firstname":"Joe","lastname":"Bloggs","SupervisorName":"Name","SupervisorID":"2468","role":"Role","active":"True","hours":["{'date':'01/01/2017','qty':'3','project':'Project 1'}"]"}
JSON 中的“营业时间”字段是一个列表。目的是在每个 PUT 请求中将一个对象附加到列表中。
几个小时的解析器是:
parser.add_argument('hours', action='append')
Put 方法代码为:
def put(self, EmployeeID=None):
data = parser.parse_args()
if not data:
data = {'ERROR': 'No Data'}
return jsonify(data)
else:
if EmployeeID:
if mongo.db.employee.find_one({'EmployeeID': EmployeeID}):
mongo.db.employee.update_one({'EmployeeID': EmployeeID}, {set: {"hours": data.get('hours')}})
return {'response': 'Employee:'+str(EmployeeID)+' updated'}
else:
return {'Error': 'employee ' + str(EmployeeID) + ' not found'}
else:
return {'response': 'Employee ID missing'}
update_one 方法适合这里使用吗?
使用 curl PUT 请求:
curl -H "Content-type: application/json" -X PUT -d '{"EmployeeID":"1234",...,"hours":{'time':'','qty':'3','project':'Project 1'}}' http://127.0.0.1:5000/api/people/1234
报错:
{
"message": "Failed to decode JSON object: Expecting property name enclosed in double quotes: line 1 column 168 (char 167)"
}
但是当我将引号添加到请求中时 return 出现错误:
{
"message": "Failed to decode JSON object: Unterminated string starting at: line 1 column 167 (char 166)"
}
我无法确定请求或实际 Flask-Restful 代码是否存在问题。
使用对象更新 Mongo 文档列表的正确方法是什么?
我对 Flask 没有太多经验,但是从您发布的错误消息来看,请求中的 JSON 似乎无法被 Flask 正确解码。我相信这是因为您在 JSON 字符串中使用了单引号,并用另一组单引号将整个 JSON 包裹起来。
尝试在 JSON 字符串中使用双引号,并将整个 JSON 字符串用单引号括起来,如下所示:
curl -H "Content-type: application/json" -X PUT -d '{"EmployeeID":"1234","hours":{"time":"","qty":"3","project":"Project 1"}}' http://127.0.0.1:5000/api/people/1234
我认为这应该可以解决无法从请求中解码 JSON 的问题。
如果有人遇到这个问题,我终于解决了。
我必须更改 RequestParser:
parser.add_argument('hours')
删除操作='append'
然后使用 mongo 更新:
mongo.db.employee.update_one({'EmployeeID': EmployeeID}, {'$addToSet': {"hours": data.get('hours')}})
我想使用 Flask Restful 使用 PUT 请求更新包含对象的列表。
结果 JSON 应如下所示:
{"EmployeeID":"12345", "firstname":"Joe","lastname":"Bloggs","SupervisorName":"Name","SupervisorID":"2468","role":"Role","active":"True","hours":["{'date':'01/01/2017','qty':'3','project':'Project 1'}"]"}
JSON 中的“营业时间”字段是一个列表。目的是在每个 PUT 请求中将一个对象附加到列表中。
几个小时的解析器是:
parser.add_argument('hours', action='append')
Put 方法代码为:
def put(self, EmployeeID=None):
data = parser.parse_args()
if not data:
data = {'ERROR': 'No Data'}
return jsonify(data)
else:
if EmployeeID:
if mongo.db.employee.find_one({'EmployeeID': EmployeeID}):
mongo.db.employee.update_one({'EmployeeID': EmployeeID}, {set: {"hours": data.get('hours')}})
return {'response': 'Employee:'+str(EmployeeID)+' updated'}
else:
return {'Error': 'employee ' + str(EmployeeID) + ' not found'}
else:
return {'response': 'Employee ID missing'}
update_one 方法适合这里使用吗?
使用 curl PUT 请求:
curl -H "Content-type: application/json" -X PUT -d '{"EmployeeID":"1234",...,"hours":{'time':'','qty':'3','project':'Project 1'}}' http://127.0.0.1:5000/api/people/1234
报错:
{
"message": "Failed to decode JSON object: Expecting property name enclosed in double quotes: line 1 column 168 (char 167)"
}
但是当我将引号添加到请求中时 return 出现错误:
{
"message": "Failed to decode JSON object: Unterminated string starting at: line 1 column 167 (char 166)"
}
我无法确定请求或实际 Flask-Restful 代码是否存在问题。
使用对象更新 Mongo 文档列表的正确方法是什么?
我对 Flask 没有太多经验,但是从您发布的错误消息来看,请求中的 JSON 似乎无法被 Flask 正确解码。我相信这是因为您在 JSON 字符串中使用了单引号,并用另一组单引号将整个 JSON 包裹起来。
尝试在 JSON 字符串中使用双引号,并将整个 JSON 字符串用单引号括起来,如下所示:
curl -H "Content-type: application/json" -X PUT -d '{"EmployeeID":"1234","hours":{"time":"","qty":"3","project":"Project 1"}}' http://127.0.0.1:5000/api/people/1234
我认为这应该可以解决无法从请求中解码 JSON 的问题。
如果有人遇到这个问题,我终于解决了。
我必须更改 RequestParser:
parser.add_argument('hours')
删除操作='append'
然后使用 mongo 更新:
mongo.db.employee.update_one({'EmployeeID': EmployeeID}, {'$addToSet': {"hours": data.get('hours')}})