Flask-RESTful 嵌套资源

10 投票
1 回答
5336 浏览
提问于 2025-04-19 02:53

我正在重构我的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..]
        })

你可以看到,你正在使用网址中的变量部分,也就是用户的名字,来查询订单的接口。

撰写回答