我正在使用Flask-RESTful开发API,我的应用程序有三个角色。
- site_admin (站点管理员)
- department_admin (部门管理员)
- basic (基础用户)
对于任何给定的资源,返回的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}
]
}
然而,如果您以“department_admin”的身份访问/orders,则结果可能如下所示:
{
"orders": [
{"id": 3, "user": "meh", "paid": False}
]
}
如果您使用/orders作为“基本”请求,那么返回的JSON响应将非常简单,如下所示:
{
"orders": [
{"id": 2, "paid": True}
]
}
如何用RESTful的方式实现这个功能?
我可以想到三种方法来实现它。
(1) 使用请求参数并根据该参数进行过滤:
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')
(2) 在 session 对象上进行过滤:
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')
(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')
有没有一个共识,哪种方式是首选的 RESTful 方式?
非常感谢!