() translation by (you can also view the original English article)
Im ersten Teil dieser dreiteiligen Tutorial-Reihe haben wir gesehen, wie RESTful-APIs mithilfe von Flask als Webframework selbst geschrieben werden. Im zweiten Teil haben wir eine RESTful-API mit Flask-Restless erstellt, die von SQLAlchemy als ORM abhängt. In diesem Teil verwenden wir eine andere Flask-Restful, Flask-Restful, die Ihr ORM abstrahiert und keine Annahmen darüber macht.
Ich werde dieselbe Beispielanwendung wie im letzten Teil dieser Reihe verwenden, um den Kontext und die Kontinuität aufrechtzuerhalten. Obwohl diese Beispielanwendung auf SQLAlchemy selbst basiert, kann diese Erweiterung zusammen mit jedem ORM auf ähnliche Weise verwendet werden, wie in diesem Tutorial gezeigt.
Abhängigkeiten installieren
Während wir mit der Anwendung aus dem ersten Teil fortfahren, müssen wir nur eine Abhängigkeit installieren:
1 |
$ pip install Flask-Restful |
Die Anwendung
Bevor wir beginnen, möchten Sie möglicherweise den Code entfernen, den wir für den zweiten Teil dieser Lernserie geschrieben haben, um mehr Klarheit zu schaffen.
Wie immer beginnen wir mit Änderungen an der Konfiguration unserer Anwendung, die ungefähr wie die folgenden Codezeilen aussehen:
flask_app/my_app/__init__.py
1 |
from flask.ext.restful import Api |
2 |
|
3 |
api = Api(app) |
Es sollte ausreichen, nur die obigen Zeilen zum vorhandenen Code hinzuzufügen.
lask_app/my_app/catalog/views.py
1 |
import json |
2 |
from flask import Blueprint, abort |
3 |
from flask.ext.restful import Resource |
4 |
from flask.ext.restful import reqparse |
5 |
from my_app.catalog.models import Product |
6 |
from my_app import api, db |
7 |
|
8 |
|
9 |
catalog = Blueprint('catalog', __name__) |
10 |
|
11 |
parser = reqparse.RequestParser() |
12 |
parser.add_argument('name', type=str) |
13 |
parser.add_argument('price', type=float) |
14 |
|
15 |
|
16 |
@catalog.route('/') |
17 |
@catalog.route('/home') |
18 |
def home(): |
19 |
return "Welcome to the Catalog Home." |
20 |
|
21 |
|
22 |
class ProductApi(Resource): |
23 |
|
24 |
def get(self, id=None, page=1): |
25 |
if not id: |
26 |
products = Product.query.paginate(page, 10).items |
27 |
else: |
28 |
products = [Product.query.get(id)] |
29 |
if not products: |
30 |
abort(404) |
31 |
res = {} |
32 |
for product in products: |
33 |
res[product.id] = { |
34 |
'name': product.name, |
35 |
'price': product.price, |
36 |
}
|
37 |
return json.dumps(res) |
38 |
|
39 |
def post(self): |
40 |
args = parser.parse_args() |
41 |
name = args['name'] |
42 |
price = args['price'] |
43 |
product = Product(name, price) |
44 |
db.session.add(product) |
45 |
db.session.commit() |
46 |
res = {} |
47 |
res[product.id] = { |
48 |
'name': product.name, |
49 |
'price': product.price, |
50 |
}
|
51 |
return json.dumps(res) |
52 |
|
53 |
api.add_resource( |
54 |
ProductApi, |
55 |
'/api/product', |
56 |
'/api/product/<int:id>', |
57 |
'/api/product/<int:id>/<int:page>'
|
58 |
)
|
Der größte Teil des obigen Codes ist selbsterklärend. Ich werde jedoch einige Punkte hervorheben. Der obige Code scheint dem im ersten Teil dieser Serie sehr ähnlich zu sein, aber hier führt die verwendete Erweiterung eine Reihe von Optimierungen hinter den Kulissen durch und bietet viel mehr Funktionen, die genutzt werden können.
Hier werden die Methoden, die unter einer Klasse deklariert sind, die Resource
unterordnet, automatisch für das Routing berücksichtigt. Außerdem müssen alle Parameter, die wir zusammen mit eingehenden HTTP-Aufrufen erwarten, mit reqparse
analysiert werden.
Testen der Anwendung
Diese Anwendung kann genauso getestet werden wie im zweiten Teil dieser Tutorial-Reihe. Ich habe die Routing-URL für den gleichen Zweck gleich gehalten.
Abschluss
In diesem letzten Teil dieser dreiteiligen Lernserie zur Entwicklung von RESTful-APIs mit Flask haben wir gesehen, wie ORM-unabhängige RESTful-APIs geschrieben werden. Dies fasst die Grundlagen des Schreibens von RESTful-APIs mit Flask auf verschiedene Arten zusammen.
Zu jeder der behandelten Methoden können Sie mehr lernen, und Sie können dies anhand der in dieser Reihe erlernten Grundlagen selbst untersuchen.