【发布时间】:2015-01-30 02:49:09
【问题描述】:
我正在使用 Flask-RESTful 开发 API,我的应用程序具有三个角色。
- site_admin
- 部门管理员
- 基本
对于任何给定的资源,返回的 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}
]
}
但是,如果您将 /orders 设置为“department_admin”,结果可能如下所示:
{
"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) 对会话对象进行过滤:
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')
...对于哪种方式是 RESTfully 的首选方式是否存在共识?
非常感谢!
【问题讨论】:
-
请注意,由于您使用了用户会话,第二个选项并不是真正的 RESTful。 REST API 不应该存储任何客户端状态。相反,您应该要求客户端对他们发送给您的每个请求进行身份验证。
-
@Miguel 好电话。那么,您对 (1) 和 (3) 之间的区别有何看法?
-
我认为(2)是最好的选择,如果做得对的话。让我在答案中阐述这一点。
标签: python json rest flask flask-restful