Flask-RESTful嵌套资源

10

我正在重构我的REST API服务器,使用Flask-RESTful,并且对于一些需要获取属于其他资源列表的特定情况表示疑虑。类似这样的内容:

/api/v1/users/john/orders
因为如果我有一个名为Orders的资源,我需要知道从哪个用户那里获取订单,你会如何设计这个功能呢?但是我该如何让资源知道用户信息呢?我并没有看到任何可以在资源中指定参数的__ init __方法。
当注册Orders资源时,我考虑做类似以下的操作:
api.add_resources(Orders, '/api/v1/users/<string:username>/orders')

但是如何在 Orders 资源中访问 string:username

我猜一个解决方案是:

api.add_resources(Orders, '/api/v1/orders/') 

我想发送查询参数以指定要从中获取订单的用户,但我想知道是否可能像上面的示例那样做。


你想出怎么做了吗? - Andrii Yurchuk
1
抱歉,我忘记了这个。是的!我会编辑问题,这样你就可以看到它了。 - Sebastian
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..]
        })

如您所见,您正在使用url的变量部分——用户的名称,用于查询订单终点。


我该如何使用flask_restful实现像/api/v1/user/string:name/orders/string:id/query/这样的功能呢?如果您能指导我正确的方向,我将不胜感激... - Rotkiv
1
你会做同样的事情,只是在URL字符串和GET方法中会有两个参数。但是如果你已经发送了订单ID,那么为什么还要发送一个查询呢?无论如何,如果这是你需要的,你可以像上面一样添加新参数来完成。 - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接