11

在 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-->CuteKitty.habits(kitty_id)

4

2 回答 2

20

Flask-RESTful 旨在通过解释 HTTP 请求方法来专门实现 RESTful API。Drink 和 Meow 不是标准的 HTTP 方法,因此 Flask-RESTful 不关心资源中的drinkandmeow方法。

解决方案是定义多个 API 路由:

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/')

不太直观(而且更糟糕)的方法是创建一个 frankenresource:

# 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>/')

然后用它们打破参数split('/')并调用任务。或者,您可以将它们设置为 URL 参数 ( /endpoint/?task=drink&what=milk)——这仍然是一个有效的 RESTful 架构。

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

于 2014-09-11T03:35:28.220 回答
1

第 1 步:编写资源类。

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步:在类下面,或者在获得callable之后,

api.add_resource(CuteKitty,'/api/kitty/meow',endpoint='meow',methods=['GET'])
于 2021-03-26T05:53:00.520 回答