【发布时间】:2021-06-16 10:23:05
【问题描述】:
我必须使用 Flask 和 MongoDB 实现 Web 服务。我有两个系列。 JSON 文件如下所示:
文件 products.json:
{ "name":"red apples", "price":0.5, "description":"Apples from Greece", "category":"fruits", "stock":25 }
{ "name":"fish", "price":5, "description":"Fresh fish", "category":"fish", "stock":25 }
{ "name":"pasta", "price":1.5, "description":"Pasta from Italia", "category":"pasta", "stock":25 }
文件 users.json:
{"name":"George Vaios", "password":"321", "email":"george@gmail.gr", "category":"admin"}
{"name":"Admin", "password":"admin", "email":"admin@gmail.gr", "category":"admin"}
我要做什么?
我正在尝试实现一个名为add_product 的函数。此功能允许类别为 admin ("category": "admin") 的用户。由于路由有 POST 方法,因为我正在解析用户的 email,并且需要详细信息才能在 products.json 中导入新产品。
代码:
(lines of code for loading data)
user = users.find_one({"email":data['email']})
if (user['category']=="admin"):
product = {
"name": data['name'],
"price": data['price'],
"description": data['description'],
"category": data['category'],
"stock": data['stock']
}
products.insert_one(product)
return Response("Product was added succesfully", status=200, mimetype='application/json')
else:
return Response("Account has no permission. Must be an admin", status=400, mimetype='application/json')
使用该代码,我试图通过使用find_one 方法在JSON 文件中找到用户来检查用户是否是管理员,然后将user['category'] 与字符串'admin' 进行比较。
我正在解析给邮递员的数据:
{
"email": "george@gmail.gr",
"name": "chocolate",
"price": 25,
"description": "mklkgj",
"category": "sweets",
"stock": 30
}
我得到的错误:
File "/home/michael/main.py", line 241, in add_product_admin
if (user['category']=="admin"):
TypeError: 'NoneType' object is not subscriptable
我不明白为什么 if 语句不进行比较。有什么想法吗?
【问题讨论】:
-
find_one如果找不到任何匹配项,将返回 None,这将导致您在尝试下标时看到错误。所以我会先检查用户不是 None 。然后尝试找出为什么 find_one() 无法找到您所期望的。 -
附带说明,您似乎正在尝试使用 POST 有效负载的“电子邮件”部分作为授权手段。我希望您意识到,不仅“george@gmail.gr”电子邮件帐户的合法所有者可以提交此类请求。
-
@saquintes 嗯,我明白了。我检查了 Mongo shell 中的用户集合是否为空。确实有零条目。但仍然无法理解为什么会发生这种情况。也许我在使用 JSON 文件创建集合时犯了一个错误
-
@AlexBlex 是的,我明白了。那是一个uni项目,我没有这样的经验来避免通过更好的实践获得授权。这就是为什么我只是试图通过比较来实现这一点