Python 带对象的Flask Restful放置更新列表

Python 带对象的Flask Restful放置更新列表,python,json,mongodb,put,flask-restful,Python,Json,Mongodb,Put,Flask Restful,我想使用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'}"]"

我想使用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'}
更新方法是这里使用的正确方法吗

使用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)"
}
但当我将报价添加到请求中时,它会返回一个错误:

 {
 "message": "Failed to decode JSON object: Unterminated string starting at: line 1 column 167 (char 166)"
}
我无法确定请求或实际的Flask Restful代码是否存在问题


使用对象更新Mongo文档列表的正确方法是什么?

我对Flask没有太多经验,但从您发布的错误消息来看,Flask似乎无法正确解码请求中的JSON。我相信这是因为您在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')
删除操作class='append'

然后使用mongo更新:

mongo.db.employee.update_one({'EmployeeID': EmployeeID}, {'$addToSet': {"hours": data.get('hours')}}) 

这解决了JSON解析问题,谢谢,然后不得不将更新方法更改为mongo.db.employee.update_one({'EmployeeID':EmployeeID},{'$set':{“hours”:data.get('hours')})不幸的是,这将覆盖当前对象,然后我尝试使用方法'$addToSet',但是这添加了一个包含现有列表中的对象的新列表一旦我在这里找到正确的解决方案,我将添加答案我相信您需要使用操作符这样做:
db.getCollection('employee').update({“EmployeeID”:ObjectId(“58a480857cd7908d4fe69074”),{“$push”:{“小时”:{“日期”:“01/01/2017”,“项目”:“项目2”,“数量”:“4”}}};
。这是在MongoDb shell中完成的。您需要将其调整到python代码中。我最终使用的是$addToSet方法,而不是$push。不确定是否有多大区别??