我一直在使用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感觉有点蠢。还有更好的方法吗?
答案 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将为我提供属于该用户的所有设备的列表。为了获得这些信息,您首先需要知道要求哪个用户的设备