【问题标题】:Flask-RESTful custom routes other than GET,PUT,POST,DELETE除了 GET、PUT、POST、DELETE 之外的 Flask-RESTful 自定义路由
【发布时间】:2014-11-03 15:39:07
【问题描述】:

在 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)

【问题讨论】:

  • 破解示例! :)

标签: python flask flask-restful


【解决方案1】:

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

解决方案是定义多个 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/')

不太直观(而且 imo 更糟糕)的方法是创建一个 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&amp;what=milk)——这仍然是一个有效的 RESTful 架构。

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

【讨论】:

  • 这消除了我的很多困惑,但我只是想如果有机会我可以将属于CuteKitty 的所有代码放在一个文件/类中,这似乎是 REST-ful不允许这样做。我也不会自己为/endpoint/&lt;id&gt;/&lt;task&gt;/&lt;args&gt; 编写大量样板代码。我想我现在会坚持写很多课。谢谢@justanr!
【解决方案2】:

第 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 步:在类下面,或在获取可调用对象之后,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多