Sea*_*lus 5 python rest json flask flask-restful
我正在使用Flask-RESTful开发API,而我的应用程序具有三个角色。
对于任何给定资源,根据每个角色,返回的JSON对象都有一组不同的键。
例如,如果您以“ site_admin”的身份打入/ orders,结果可能如下所示:
{
"orders": [
{"id": 1, "user": "foo", "paid": True, "department": "A", "code": 456},
{"id": 2, "user": "bar", "paid": False, "department": "A", "code": 567},
{"id": 3, "user": "meh", "paid": False, "department": "B", "code": 678}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您以“ department_admin”身份打入/ orders,结果可能如下所示:
{
"orders": [
{"id": 3, "user": "meh", "paid": False}
]
}
Run Code Online (Sandbox Code Playgroud)
而且,如果您将/ orders设为“基本”,则将是一个非常小的JSON响应,如下所示:
{
"orders": [
{"id": 2, "paid": True}
]
}
Run Code Online (Sandbox Code Playgroud)
RESTful的实现方式是什么?
我可以提出三种方法。
(1)使用请求arg并对其进行过滤:
class Orders(restful.Resource):
def get(self):
if request.args['role'] == 'site_admin':
return admin_JSON_response()
elif request.args['role'] == 'department_admin':
return dept_admin_JSON_response()
else:
return basic_JSON_response()
api.add_resource(Orders, '/orders')
Run Code Online (Sandbox Code Playgroud)
(2)对会话对象进行过滤:
class Orders(restful.Resource):
def get(self):
if session['role'] == 'site_admin':
return admin_JSON_response()
elif session['role'] == 'department_admin':
return dept_admin_JSON_response()
else:
return basic_JSON_response()
api.add_resource(Orders, '/orders')
Run Code Online (Sandbox Code Playgroud)
(3)每个角色都有不同的路线:
class OrdersSiteAdmin(restful.Resource):
def get(self):
return admin_JSON_response()
api.add_resource(OrdersSiteAdmin, '/orders_site_admin')
class OrdersDeptAdmin(restful.Resource):
def get(self):
return dept_admin_JSON_response()
api.add_resource(OrdersDeptAdmin, '/orders_dept_admin')
class OrdersBasic(restful.Resource):
def get(self):
return basic_JSON_response()
api.add_resource(OrdersBasic, '/orders_basic')
Run Code Online (Sandbox Code Playgroud)
...是否就RESTful的首选方式达成共识?
非常感谢!
您的选项 #2 违反了“无状态”约束,在 REST API 中使用用户会话并不是一个好主意,相反您应该要求您的客户端为每个请求提供身份验证。
假设您修复了 #2,现在您拥有一个current_user变量,而不是用户会话,该变量在身份验证期间填充。然后您可以按如下方式重写该示例:
class Orders(restful.Resource):
def get(self):
if current_user.role == 'site_admin':
return admin_JSON_response()
elif current_user.role == 'department_admin':
return dept_admin_JSON_response()
else:
return basic_JSON_response()
api.add_resource(Orders, '/orders')
Run Code Online (Sandbox Code Playgroud)
让我们一一看看您的三个选项:
(1) 在查询字符串中指定角色,这将使任何用户只需传递所需的角色即可请求任何表示。但为什么要把角色放在查询字符串中呢?我假设您将对您的用户进行身份验证,因此了解您的用户也就了解了该角色。这似乎没有必要,并且会给您带来额外的验证工作。
(3)为每个角色创建不同的资源。再次,您必须确保“基本”用户无权访问适用于高级角色的两个 URL,因此您还需要在此处进行一些验证工作。
(2) 假设用户数据库存储每个用户的角色,因此一旦用户通过身份验证,就会根据分配的角色返回其角色的正确表示。我认为这是最好的选择,因为用户实际上没有办法侵入他们不允许看到的数据。
说到 RESTful,我也会看看你的表述,这可以改进。考虑实现到其他资源的链接而不是提供 ID,以符合HATEOAS约束。
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |