除GET,PUT,POST,DELETE之外的Flask-RESTful自定义路由

时间:2014-09-10 05:17:27

标签: python flask flask-restful

在Flask-RESTful中,我们添加一个api路由,如下所示

api.add_resource(CuteKitty,'/api/kitty')

class CuteKitty(Resource):
    def get(self): return {}
    def post(self): return {}
    def put(self): return {}
    def delete(self): return None, 204

以便GET /api/kitty - >到CuteKitty.get()方法;对于所有HTTP动词都是这样的

让我们说我需要为我的api消费者提供一个可爱的api,如

POST /api/kitty/drink/milk  ---> CuteKitty.drink(what="milk")
POST /api/kitty/meow        ---> CuteKitty.meow()

如何使用api.add_resource

实现上述路由
class CuteKitty(Resource):
    def get(self): return {}
    def post(self): return {}
    def put(self): return {}
    def delete(self): return None, 204
    def drink(self,what="milk"): return {}
    def meow(self): return {}

同样如何添加/api/kitty/<int:kitty_id>/habits之类的路线 - &gt; CuteKitty.habits(kitty_id)

2 个答案:

答案 0 :(得分:6)

Flask-RESTful旨在通过解释HTTP Request方法专门实现RESTful API。饮料和喵显然不是HTTP方法(至少它们不在规范中 - 我会留下它),Flask-RESTful并不关注{{1}资源中的{}和drink方法。

明显的答案是定义多个API路径:

meow

不太明显的方法是创建一个frankenresource:

api.add_resource(CuteKitty, '/kitty/<int:kitty_id>/')
api.add_resource(DrinkingKitty, '/kitty/<int:kitty_id>/drink/<what>')
api.add_resource(MeowingKitty, '/kitty/<int:kitty_id>/meow/')

然后用# still allow requests to hit just get/post/etc without invoking anything else api.add_resource(CuteKitty, '/kitty/<int:kitty_id>/') api.add_resource(CuteKitty, '/kitty/<int:kitty_id>/<task>/<path:args>/') 打破args并用它们调用任务。或者,您可以将它们设置为URL参数(split('/')) - 这仍然是一个有效的RESTful架构。

您也可以继承Resource类并自己实现所需的功能 - 在这种情况下,我建议您查看Flask-Classy如何实现此功能。或者你可以拿起Flask-Classy并用它玩具,看看你也喜欢它;但是,对于一个直接的API,我认为RESTful比Classy带来更多的东西。

答案 1 :(得分:0)

第 1 步:编写 Resource 类。

class CuteKitty(Resource):
   def get(self): return {}
   def post(self): return {}
   def put(self): return {}
   def delete(self): return None, 204
   def meow(self): return {}

第 2 步:在类下面,或者在获取可调用对象之后,

api.add_resource(CuteKitty,'/api/kitty/meow',endpoint='meow',methods=['GET'])