2014-09-10 3 views
4

В Колба-RESTful мы добавляем маршрут апи как нижеКолбы-RESTful кроме GET пользовательских маршрутов, PUT, POST, DELETE

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 с милым апи как

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

Как я achive вышеуказанных маршрутизаций с 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)

ответ

5

Flask-RESTful предназначен для реализации API RESTful специально путем интерпретации ting метод HTTP-запроса. Drink и Meow, очевидно, не являются HTTP-методами (по крайней мере, они не указаны в спецификации), Flask-RESTful не связан с методами и meow в ресурсе.

Очевидный ответ на это, чтобы определить несколько маршрутов 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.

Вы также можете подклассифицировать класс ресурсов и реализовать желаемую функциональность самостоятельно - в этом случае я бы рекомендовал посмотреть, как Flask-Classy реализует это. Или вы можете подобрать Flask-Classy и поиграть с ним и посмотреть, как вам это нравится; однако для прямого API я считаю, что RESTful приносит намного больше, чем Classy.

+0

Это освобождает меня от путаницы, но я просто подумал, что если я случайно могу использовать весь код, принадлежащий 'CuteKitty', в одном файле/классе, кажется, что REST-ful не позволяет этого. Я также не знаю, что написать сам код котельной плиты сам для '/ endpoint///'. Наверное, я буду придерживаться написания многих классов на данный момент. Спасибо @justanr! – cackharot