如何在 Flask 和 Pymongo 中正确编写 "Patch" 端点

How to properly write a "Patch" endpoint in flask and Pymongo

我对一般的 API 和编码不熟悉,所以我真的很难让 Flask 和 PyMongo 正确地协同工作(因为我不知道我在做什么)。我正在尝试为 PATCH 请求编写一个简单的端点。代码在这里:

@app.route('/update-instructor/<id>', methods=['PATCH'])
def update_one_instructor(id):
  id = ObjectId(id)
  id_call = {"_id" : id}
  course = request.json.get("course")
  email = request.json.get("email")
  first = request.json.get("first")
  last = request.json.get("last")
  password = request.json.get("password")
  role = request.json.get("role")

  updateObject = {
    "course": course,
    "email": email,
    "first": first,
    "last": last,
    "password": password,
    "role": role
  }

  result = instructors.find_one_and_update(id_call, {"$set":updateObject}, return_document=ReturnDocument.AFTER)
  return f'Instructor information updated {updateObject}'

但是,当我将其传递到我的数据库时,它会更新我设置的字段,但将其他所有内容设置为 'null'。因此,如果在 Postman 中,我提交:

{
"first" : "Jim"
}

它有效,但所有其他字段(以前保存的值)都设置为空。显然,我不想在执行 PATCH 请求时设置 JSON 中的每个键值对,对吗?这到底是怎么回事?

我对这里写的理解是,它使用BSON获取ObjectId并找到instructor,然后每个变量使用request.json找到当前值是什么。然后将它们传递给 updateObject(我认为默认值是以前保存的值,除非 Postman 中的正文另有说明......)然后将其传递给 pymongo find_one_and_update 方法。

请新手帮帮忙!谢谢!

@app.route('/update-instructor/<id>', methods=['PATCH'])
def update_one_instructor(id):
    request_params = request.get_json()
    print(request_params)
    # {'first': 'me', 'email': 'email'}  only gives you the things from postman

    updateObject = request_params
    # updateObject = {
    #     "course": course,
    #     "email": email,
    #     "first": first,
    #     "last": last,
    #     "password": password,
    #     "role": role
    # }

    # Continue with your logic


    return "Update Successful"

我把这个放在邮递员里:

  {
    "first": "me",
    "email": "email"
  }