2015-09-06 160 views
2

以下罷工我不雅,但它的作品。有沒有辦法使用相同的資源類來讓燒瓶平靜地處理兩種標準風格的get(即獲取所有東西並獲得一個項目)?GET和無參數燒瓶寧靜

謝謝。

from flask_restful import Resource 
# ... 

class People(Resource): 
    def get(self): 
     return [{'name': 'John Doe'}, {'name': 'Mary Canary'}] 

class Person(Resource): 
    def get(self, id): 
     return {'name': 'John Doe'} 
# ... 

api.add_resource(People, '/api/people') 
api.add_resource(Person, '/api/people/<string:id>') 
+0

對不起,但我不這麼認爲。每當我嘗試時,我收到「TypeError:get()缺少1所需的位置參數」錯誤。如果位置參數可以是可選的,那麼它會很好,當它沒有被傳遞時設置爲None,但可能有一個原因,它不會以這種方式工作。 –

+0

我終於對此感到沮喪,因爲我測試了另一種實現的概念驗證 - GIST在這裏http://bit.ly/1RVzWm9。我相信,並在這裏這麼說:https://github.com/flask-restful/flask-restful/issues/114,其原因是Flask-Restful遵循了Flask's add_url_rule。 –

回答

0

是的,請查看argument parsing documentation。如果需要,這將使您可以靈活地根據請求收到的參數創建一些邏輯。

from flask_restful import Api, Resource, reqparse 
# ... 

api = Api(app) 
parser = reqparse.RequestParser() 
parser.add_argument('id') 

class People(Resource): 
def get(self): 
    data = parser.parse_args() 
    if not data['id']: 
     return [{'name': 'John Doe'}, {'name': 'Mary Canary'}] 
    else: 
     # data lookup using id 
     # for example using SQLAlchemy... 
     # person = Person.query.filter_by(id = data['id']).first_or_404() 
     return {'id': data['id'], 'name': 'John Doe'} 

api.add_resource(People, '/api/people') 

然後嘗試使用:

  • 本地主機:/ API /人
  • 本地主機:?/ API /人ID = 1
+0

我認爲這不是如何實現寧靜的方式.. imo – rrw

+0

可能不是對REST規範,但它仍然有可能與'瓶 - 寧靜' – siegerts

+0

是的,我沒有說它不可能,我看到它很好,但我只是說它不是它應該實現的方式,如果它的REST,因爲一些初學者搜索並會偶然發現這可能認爲這是它應該實現的方式:) – rrw

1

我覺得這是你在做什麼尋找:

from flask_restful import Resource 
# ... 


class People(Resource): 

    def get(self, id=None): 
     if not id: 
      return {'name': 'John Doe'} 
     return [{'name': 'John Doe'}, {'name': 'Mary Canary'}] 


api.add_resource(People, '/api/people', '/api/people/<id>') 

你可以把限制ns在id購買將它作爲參數添加到請求解析器:

parser.add_argument('id', location='view_args', type=..)