【问题标题】:Flask Restful PUT update list with object带有对象的 Flask Restful PUT 更新列表
【发布时间】:2017-07-04 07:36:45
【问题描述】:

我想使用 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 文档列表的正确方法是什么?

【问题讨论】:

    标签: python json mongodb put flask-restful


    【解决方案1】:

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

    【讨论】:

    • 解决了 JSON 解析问题,谢谢,不得不将更新方法更改为 mongo.db.employee.update_one({'EmployeeID': EmployeeID}, {'$set': {"hours" : data.get('hours')}})
    • 不幸的是,这会覆盖当前对象,然后我尝试使用方法'$addToSet',但这添加了一个包含现有列表中的对象的新列表
    • 一旦我在这里找到正确的解决方案,我会添加答案
    • 我相信您需要像这样使用$push 运算符:db.getCollection('employee').update({"EmployeeID" : ObjectId("58a480857cd7908d4fe69074")}, {"$push": { "hours": { "date" : "01/01/2017", "project" : "Project 2", "qty" : "4" }}});。这是在 MongoDb shell 中完成的。您需要根据您的 python 代码对其进行调整。
    • 我最终使用了 $addToSet 方法而不是 $push。不知道有没有太大区别??
    【解决方案2】:

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

    我不得不更改 RequestParser:

    parser.add_argument('hours')
    

    删除操作='append'

    然后使用 mongo 更新:

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

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 2021-10-17
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 2021-04-08
      • 2015-09-01
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多