我正在使用Flask-RESTful开发API,并且我的应用程序有三个角色。基于用户角色RESTfully路由API
- site_admin
- department_admin
- 基本
对于任何给定的资源,JSON对象返回都有一套不同的基于每个角色的键。
例如,如果你打/订单为“site_admin”,其结果可能是这样的:
{
"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": [
{"id": 3, "user": "meh", "paid": False}
]
}
如果你打/订单为 “基本”,它会是这样一个很小的JSON响应:
{
"orders": [
{"id": 2, "paid": True}
]
}
实现这个的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')
(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 2014-12-02 15:38:08
@Miguel很好的电话。那么你对(1)和(3)之间的区别有什么想法? – SeanPlusPlus 2014-12-02 20:44:32
我认为(2)是最好的选择,如果做得对。让我在回答中提出这个问题。 – Miguel 2014-12-02 21:50:11