Construirea API-urilor rapide cu balon abordarea DIY

Reprezentarea transferului de stat (REST) este un stil de design al arhitecturii de dezvoltare web care se referă la separarea logică a resurselor dvs. API astfel încât să permită accesul ușor, manipularea și scalarea. Componentele reutilizabile sunt scrise astfel încât să poată fi ușor de gestionat prin intermediul unor cereri HTTP simple și intuitive care pot fi GET, POST, PUT, PATCH și DELETE (pot exista mai multe, dar mai sus sunt cele mai frecvent utilizate).

În ciuda a ceea ce pare, REST nu comandă un protocol sau un standard. Stabilește un stil arhitectural software pentru scrierea aplicațiilor web și API-urilor și are ca rezultat simplificarea interfețelor în interiorul și în afara aplicației. API-urile de servicii web care sunt scrise astfel încât să respecte principiile REST, ele sunt denumite API RESTful.

În această serie de tutoriale din trei părți, voi aborda diferite moduri în care pot fi create API-urile RESTful utilizând Flask ca cadru web. În prima parte, mă voi referi la modul de creare a API-urilor REST bazate pe clasă, care sunt mai degrabă asemănătoare cu DIY, adică implementarea acestora de unul singur fără a utiliza extensii de la terțe părți. În cele din urmă părți ale acestei serii, mă voi referi la modul de utilizare a extensiilor de tip Flask pentru a construi mai eficient API REST într-un mod mai ușor.

Presupun că aveți o înțelegere de bază a celor mai bune practici de configurare a balonului și a mediului utilizând virtualenv care trebuie urmat în timp ce dezvoltați o aplicație Python.

Instalarea dependențelor

Următoarele pachete trebuie să fie instalate pentru aplicația pe care o vom dezvolta.

$ pip instalare flacon $ pip instalare flask-sqlalchemy

Comenzile de mai sus ar trebui să instaleze toate pachetele necesare care sunt necesare pentru ca această aplicație să funcționeze.

Aplicația Flaky

Pentru acest tutorial, voi crea o aplicație mică în care voi crea un model trivial pentru Produs. Apoi voi demonstra cum putem scrie un API RESTful pentru acelasi lucru. Mai jos este structura aplicației.

flask_app / my_app / - __init__.py produs / - __init__.py // Fișier gol - models.py - views.py - run.py

Nu voi crea un front-end pentru această aplicație, deoarece punctele finale ale API-urilor pot fi testate direct prin efectuarea de apeluri HTTP utilizând diverse alte metode.

flask_app / my_app / __ init__.py

din importul flaconului Flask din flask.ext.sqlalchemy import SQLAlchemy app = Flask (__name__) app.config ['SQLALCHEMY_DATABASE_URI'] = 'sqlite: ////tmp/test.db' db = SQLAchimă (app) din my_app.catalog .views import catalog app.register_blueprint (catalog) db.create_all ()

În fișierul de mai sus, aplicația a fost configurată cu inițializarea extensiilor și, în final, cu crearea bazei de date. Ultima afirmație creează o nouă bază de date în locația furnizată SQLALCHEMY_DATABASE_URI dacă o bază de date nu există deja în acea locație, altfel se încarcă aplicația cu aceeași bază de date.

flask_app / my_app / Catalog / models.py

de la my_app import db class Produs (db.Model): id = db.Column (db.Integer, primary_key = True) nume = db.Column (db.String (255)) price = db.Column (db.Float = Adevărat)) def __init __ (sine, nume, preț): self.name = nume self.price = preț def __repr __ (self): return ''% self.id

În fișierul de mai sus, am creat un model foarte trivial pentru stocarea numelui și a prețului unui Produs. Aceasta va crea un tabel în SQLite corespunzând detaliilor furnizate în model.

flask_app / my_app / Catalog / views.py

importul json din cererea de import de flacără, jsonify, Blueprint, renunțarea la flask.views import MetodaView din importul my_app db, app din importul my_app.catalog.models Catalog de produse = Blueprint ('catalog', __name__) @ catalog.route (' ) @ catalog.route ('/ home') def home (): întoarceți-vă "Bine ați venit în Catalogul de acasă." Clasa ProductView (MethodView): def get (auto, id = Niciuna, page = 1): if not id: products = Product.query.paginate (page, 10) .items res =  .id] = 'nume': nume de produs, 'pret': str (product.price), altceva: product = Product.query.filter_by (id = id) .first ) res = 'nume': nume de produs, 'preț': str (product.price), retur jsonify (res) def post (self): name = request.form.get ('name') price = request .product (nume, preț) db.session.add (produs) db.session.commit () retur jsonify (product.id: 'nume': product.name, price: str (product.price), def put (self, id): # Actualizați înregistrarea pentru ID-ul furnizat # cu detaliile furnizate. return def delete (auto, id): # Ștergeți înregistrarea pentru ID-ul furnizat. înapoi product_view = ProductView.as_view ('product_view') app.add_url_rule ('/ product /', view_func = product_view, methods = ['GET', 'POST'', view_func = vizualizare produs, metode = [' GET '])

Cea mai importantă bază a acestui tutorial este tratată în dosarul de mai sus. Flask oferă o utilitate denumită vizualizări pluggable, care vă permite să creați vizualizări sub formă de clase în loc de funcții în mod normal. Dispecerizarea bazată pe metodă (MethodView) este o implementare a vizualizărilor pluggable care vă permite să scrieți metode corespunzătoare cu metode HTTP cu litere mici. În exemplul de mai sus, am scris metode obține() și post() corespunzătoare HTTP-urilor OBȚINE și POST respectiv.

Rutarea este, de asemenea, implementată într-o manieră diferită, în ultimele rânduri din fișierul de mai sus. Putem specifica metodele care vor fi suportate de o anumită regulă. Orice alt apel HTTP ar fi îndeplinit Eroare 405 Metoda nu este permisă.

Rularea aplicației

Pentru a rula aplicația, executați scriptul run.py. Conținutul acestui script este:

din aplicația de import my_app app.run (debug = True)

Acum executați din linia de comandă:

$ python run.py

Pentru a verifica dacă aplicația funcționează, deschideți http://127.0.0.1:5000/ în browserul dvs. și un ecran simplu cu un mesaj de întâmpinare vă salut.

Testarea API-ului RESTful

Pentru a testa acest API, putem pur și simplu efectua apeluri HTTP folosind oricare din multele metode disponibile. Apelurile GET pot fi făcute direct prin browser. Apelurile POST pot fi efectuate utilizând o extensie Chrome cum ar fi Postman sau din linia de comandă cu ajutorul răsuci, sau putem folosi Python cereri biblioteca să facă treaba pentru noi. Voi folosi biblioteca de cereri aici pentru demonstrații.

Să facem a OBȚINE sună mai întâi pentru a ne asigura că nu avem produse create încă. În conformitate cu designul RESTful API, primiți un apel care arată ceva de genul /produs/ ar trebui să listați toate produsele. Apoi voi crea câteva produse făcând POST sună la /produs/ cu unele date. Apoi o OBȚINE Sună la /produs/ ar trebui să listați toate produsele create. Pentru a prelua un anumit produs, a OBȚINE Sună la /produs/ ar trebui să facă treaba. Mai jos este o mostră a tuturor apelurilor care pot fi făcute utilizând acest exemplu.

$ pip cererea de instalare $ python >>> cererile de import >>> r = requests.get ('http: // localhost: 5000 / product /') >>> r.json ()  >>> r = cereri. poștă ('http: // localhost: 5000 / product /', data = 'nume': 'iPhone 6s', 'pret': 699 'price': u'699.0000000000 ', u'name': u'iPhone 6s ' >>> r = requests.post (' http: // localhost: 5000 / product / ', data = ' 'iPad Pro', 'preț': 999) >>> r.json () u'2 ': u'price': u'999.0000000000 ', u'name': u'iPad Pro ' >> r = requests.get ('http: // localhost: 5000 / product /') >>> r.json () u'1 ': u'price': u'699.0000000000 ', u'name' : u'iPhone 6 '', u'2 ': u'price': u'999.0000000000 ', u'name': u'iPad Pro ' >>> r = requests.get (' http: // localhost: 5000 / produs / 1 ') >>> r.json () u'price': u'699.0000000000 ', u'name': u'iPhone 6s '

Concluzie

În acest tutorial, ați văzut cum să creați toate interfețele RESTful de unul singur utilizând utilitarul de vizualizări pluggable al lui Flask. Aceasta este abordarea cea mai flexibilă în timp ce se scriu API-urile REST, dar implică mult mai mult cod care trebuie scris. 

Există extensii care ușurează viața și automatizează implementarea API-urilor RESTful într-o mare măsură. Voi fi acoperirea acestora în următoarele câteva părți ale acestei serii tutorial.

Cod