Flask Restful PUT更新列表与对象

时间:2017-02-15 14:57:40

标签: 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'}"]"}

JSON中的Hours字段是一个列表。目的是在每个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)"
}

但是当我在请求中添加引号时,它会返回错误:

 {
 "message": "Failed to decode JSON object: Unterminated string starting at: line 1 column 167 (char 166)"
}

我无法弄清楚这些请求是否存在问题,或者是否存在实际的Flask-Restful代码。

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

2 个答案:

答案 0 :(得分:-1)

我对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的问题。

答案 1 :(得分:-1)

如果有人遇到这个问题,我终于到了那里。

我不得不更改RequestParser:

parser.add_argument('hours')

删除action ='append'

然后使用mongo更新:

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