Flask-RESTful 嵌套资源
我正在重构我的REST API服务器,准备使用Flask-RESTful框架,但在某些情况下我有些疑惑,比如我需要获取属于另一个资源的资源列表。就像这样:
/api/v1/users/john/orders
你会怎么设计这个呢?因为如果我有一个叫“订单”的资源,我需要知道要从哪个用户那里获取订单。但是我怎么让这个资源知道用户是谁呢?我没有看到任何可以让我指定资源参数的__ init __方法。
我考虑在注册“订单”资源时做这样的事情:
api.add_resources(Orders, '/api/v1/users/<string:username>/orders')
但是我怎么能在“订单”资源中访问string:username呢?
我想一个解决方案是这样做:
api.add_resources(Orders, '/api/v1/orders/')
然后发送查询参数来指定我想从哪个用户那里获取订单,但我想知道是否可以像上面的例子那样做。
1 个回答
10
好吧,我终于搞明白了。这里是解决方案。
假设我们有一个用户的接口,可以通过名字来查找用户,而这些用户也有订单可以查询。查询订单的功能是比较通用的,只需要相应的查询参数,并且需要知道要查哪个用户的订单:
from flask import Flask
from flask_restful import Api
app = Flask(__name__)
app.config['DEBUG'] = True
from views import *
api = Api(app)
api.add_resource(OrdersQuery, '/api/v1/user/<string:name>/orders/query/')
在定义资源类的时候:
class OrdersQuery(Resource):
def get(self, name):
## do something with name, like retrieving the user
## probably grab the orders and apply the query with the params from the url
return jsonify({
'result_list': [..something in here..]
})
你可以看到,你正在使用网址中的变量部分,也就是用户的名字,来查询订单的接口。