如何访问Flask-Classy中的嵌套资源?

时间:2015-02-17 23:39:53

标签: python rest flask crud flask-restful

我一直在使用Flask-Classy作为我的服务器,它运行良好。但是,我遇到了一个我还没有看过的用例,但它是一个非常常见的用例,所以如果不可能的话我会感到震惊

我有两个我想要嵌套的API,我的意思是:

class UsersView(FlaskView):
    decorators = [jwt_required()]
    route_prefix = '/api/v1/'

    def index(self):
    ...

位于http://example.com/api/v1/users,我可以通过http://example.com/api/v1/users/1

访问用户1

现在,我如何编写FlaskView,让我做这样的事情? http://example.com/api/v1/users/1/devices/3

当我尝试在route_prefix中嵌入资源ID时,我得到一个关键字参数错误:

class DevicesView(FlaskView):
    decorators = [jwt_required()]
    route_prefix = '/api/v1/users/<user_id>/'

    def index(self):
    ...

TypeError:index()得到了一个意外的关键字参数&#39; user_id&#39;

最后一点是我自然可以使用kwargs:

route_prefix = '/api/v1/users/<user_id>/'

def test(self, **kwargs):
    print kwargs['user_id']

http://example.com/api/v1/users/103/devices会吐出&#39; 103&#39;然而,使用kwargs感觉有点蠢。还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我在注册调用中将顶级占位符放在route_base中。

例如:

class UsersView(FlaskView):
    @route('/', methods=['GET'])
    def index(self):
        pass

class DevicesView(FlaskView):
    @route('/', methods=['GET'])
    def index(self, user_id):
        pass

UsersView.register(app, route_base='/users', trailing_slash=False)
DevicesView.register(app, route_base='/users/<user_id>/devices', trailing_slash=False)

现在user_id作为DevicesView中每个方法的第一个参数。

答案 1 :(得分:0)

如果您还没有找到解决方案......答案非常简单,您需要将索引定义为:

def index(self, user_id):

您必须这样做,因为您想知道访问所需资源的基本资源。在您的示例设备中,index将为我提供属于该用户的所有设备的列表。为了获得这些信息,您首先需要知道要求哪个用户的设备