Статьи

Создание RESTful API с помощью Flask: ORM Independent

В первой части этой серии из трех частей мы увидели, как сами писать RESTful API, используя Flask в качестве веб-фреймворка. Во второй части мы создали RESTful API, используя Flask-Restless, который зависит от SQLAlchemy в качестве ORM. В этой части мы будем использовать другое расширение Flask, Flask-Restful , которое абстрагирует ваш ORM и не делает никаких предположений по этому поводу.

Я возьму тот же пример приложения, что и в последней части этой серии, чтобы сохранить контекст и преемственность. Хотя этот пример приложения основан на самой SQLAlchemy, это расширение может использоваться вместе с любым ORM аналогичным образом, как показано в этом руководстве.

Продолжая работу с приложением из первой части, нам нужно установить только одну зависимость:

1
$ pip install Flask-Restful

Прежде чем мы начнем, вы можете захотеть удалить код, который мы написали для второй части этой серии руководств для большей ясности

Как всегда, мы начнем с изменений в конфигурации нашего приложения, которые будут выглядеть примерно так:

1
2
3
from flask.ext.restful import Api
 
api = Api(app)

Достаточно просто добавить вышеупомянутую пару строк в существующий код.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import json
from flask import Blueprint, abort
from flask.ext.restful import Resource
from flask.ext.restful import reqparse
from my_app.catalog.models import Product
from my_app import api, db
 
 
catalog = Blueprint(‘catalog’, __name__)
 
parser = reqparse.RequestParser()
parser.add_argument(‘name’, type=str)
parser.add_argument(‘price’, type=float)
 
 
@catalog.route(‘/’)
@catalog.route(‘/home’)
def home():
    return «Welcome to the Catalog Home.»
 
 
class ProductApi(Resource):
 
    def get(self, id=None, page=1):
        if not id:
            products = Product.query.paginate(page, 10).items
        else:
            products = [Product.query.get(id)]
        if not products:
            abort(404)
        res = {}
        for product in products:
            res[product.id] = {
                ‘name’: product.name,
                ‘price’: product.price,
            }
        return json.dumps(res)
 
    def post(self):
        args = parser.parse_args()
        name = args[‘name’]
        price = args[‘price’]
        product = Product(name, price)
        db.session.add(product)
        db.session.commit()
        res = {}
        res[product.id] = {
            ‘name’: product.name,
            ‘price’: product.price,
        }
        return json.dumps(res)
 
api.add_resource(
   ProductApi,
   ‘/api/product’,
   ‘/api/product/<int:id>’,
   ‘/api/product/<int:id>/<int:page>’
)

Большая часть кода выше не требует пояснений. Я выделю несколько моментов. Приведенный выше код кажется очень похожим на тот, который мы написали в первой части этой серии, но здесь используемое расширение выполняет кучу закулисных оптимизаций и предоставляет гораздо больше возможностей, которые можно использовать.

Здесь методы, объявленные в любом классе, который является подклассом Resource , автоматически рассматриваются для маршрутизации. Кроме того, любые параметры, которые мы ожидаем получить вместе с входящими HTTP-вызовами, должны быть проанализированы с помощью reqparse .

Это приложение может быть протестировано точно так же, как мы это делали во второй части этого урока. Я сохранил URL маршрутизации одинаковым для той же цели.

В этой последней части этого цикла из трех частей по разработке RESTful API с помощью Flask мы увидели, как писать ORM-независимые RESTful API. Это завершает основы написания RESTful API с помощью Flask различными способами.

Можно узнать больше о каждом из описанных методов, и вы можете изучить его самостоятельно, используя основы, которые вы узнали из этой серии.