2015-02-17 26 views
0

我一直在爲我的服務器使用Flask-Classy,並且它工作得很好。但是,我遇到了一個我從未見過的用例,但這是一個非常常見的用例,所以如果不可能,我會感到震驚。如何訪問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可以讓我做這樣的事情嗎? ​​

當我嘗試在route_prefix嵌入資源ID,我得到一個關鍵字參數錯誤:

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

    def index(self): 
    ... 

類型錯誤:指數()得到了一個意想不到的關鍵字參數 'user_ID的'

最後一個一點是我可以,當然,使用kwargs:

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

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

http://example.com/api/v1/users/103/devices會吐出「103 ',但是,使用kwargs感覺有點狡猾。有沒有更好的辦法?

回答

0

如果你還沒有找到一個解決方案尚未...答案是非常簡單的在這裏,你需要有索引定義爲:

def index(self, user_id):

你必須這樣做,因爲你會想知道通過其訪問所需資源的基礎資源。在您的示例設備索引會給我一個屬於用戶的所有設備的列表。爲了得到這些信息,你首先需要知道哪些用戶的設備被要求提供

+0

感謝您的回覆。你有沒有嘗試過,並得到它的工作?我以前嘗試過,它會拋出一個「ValueError:變量名'user_id'使用兩次。」 – SJoshi 2015-02-27 02:48:18

0

我把最高級別的佔位符放在register_base的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方法的第一個參數。