В первой части этой серии из трех частей мы увидели, как сами писать RESTful API, используя Flask в качестве веб-фреймворка. Во второй части мы создали RESTful API, используя Flask-Restless, который зависит от SQLAlchemy в качестве ORM. В этой части мы будем использовать другое расширение Flask, Flask-Restful , которое абстрагирует ваш ORM и не делает никаких предположений по этому поводу.
Я возьму тот же пример приложения, что и в последней части этой серии, чтобы сохранить контекст и преемственность. Хотя этот пример приложения основан на самой SQLAlchemy, это расширение может использоваться вместе с любым ORM аналогичным образом, как показано в этом руководстве.
Установка зависимостей
Продолжая работу с приложением из первой части, нам нужно установить только одну зависимость:
1
|
$ pip install Flask-Restful
|
Приложение
Прежде чем мы начнем, вы можете захотеть удалить код, который мы написали для второй части этой серии руководств для большей ясности
Как всегда, мы начнем с изменений в конфигурации нашего приложения, которые будут выглядеть примерно так:
flask_app / my_app / __ init__.py
1
2
3
|
from flask.ext.restful import Api
api = Api(app)
|
Достаточно просто добавить вышеупомянутую пару строк в существующий код.
flask_app / my_app / Каталог / views.py
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 различными способами.
Можно узнать больше о каждом из описанных методов, и вы можете изучить его самостоятельно, используя основы, которые вы узнали из этой серии.