Bygg RESTful APIs med flaske DIY-tilnærmingen

REPResentational State Transfer (REST) er en designutforming for webutvikling arkitektur som refererer til logisk å skille API-ressursene dine for å muliggjøre enkel tilgang, manipulering og skalering. Gjenbrukbare komponenter skrives på en måte slik at de enkelt kan administreres via enkle og intuitive HTTP-forespørsler som kan bli GET, POST, PUT, PATCH og DELETE (det kan være mer, men over er de mest brukte).

Til tross for hvordan det ser ut, styrer REST ikke en protokoll eller en standard. Det setter bare en arkitektonisk programvare for å skrive webapplikasjoner og APIer, og resulterer i forenkling av grensesnittene innenfor og utenfor applikasjonen. Web-tjeneste-APIer som er skrevet slik at de følger REST-prinsippene, kalles de RESTful APIs.

I denne tredelte opplæringsserien vil jeg dekke forskjellige måter som RESTful APIs kan opprettes ved hjelp av Flask som et webramme. I første del vil jeg dekke hvordan du oppretter klassebaserte REST-APIer som er mer som DIY (Gjør det selv), dvs. implementerer dem alle selv uten å bruke noen tredjepartsutvidelser. I de siste delene av denne serien skal jeg dekke hvordan du kan utnytte ulike flaskeutvidelser til å bygge mer effektive REST-APIer på en enklere måte.

Jeg antar at du har en grunnleggende forståelse av flask og miljøoppsett beste praksis ved hjelp av virtualenv som skal følges mens du utvikler en Python-applikasjon.

Installere avhengigheter

Følgende pakker må installeres for programmet som vi skal utvikle.

$ pip installasjonskolbe $ pip installasjonskolbe-sqlalchemy

Ovennevnte kommandoer bør installere alle nødvendige pakker som trengs for at dette programmet skal fungere.

Flaskeprogrammet

For denne opplæringen vil jeg lage et lite program der jeg skal lage en triviell modell for Produkt. Da vil jeg demonstrere hvordan vi kan skrive en RESTful API for det samme. Nedenfor er strukturen av søknaden.

flask_app / my_app / - __init__.py produkt / - __init__.py // Tøm fil - models.py - views.py - run.py

Jeg vil ikke skape en frontend for denne applikasjonen, fordi RESTful APIs endepunkter kan testes direkte ved å lage HTTP-anrop ved hjelp av ulike andre metoder.

flask_app / my_app / __ init__.py

fra kolbe importere kolbe fra flask.ext.sqlalchemy import SQLAlchemy app = Flask (__ name__) app.config ['SQLALCHEMY_DATABASE_URI'] = 'sqlite: ////tmp/test.db' db = SQLAlchemy (app) fra my_app.catalog .views import katalog app.register_blueprint (katalog) db.create_all ()

I filen ovenfor er applikasjonen konfigurert med initialisering av utvidelsene og endelig opprettelse av databasen. Den siste setningen oppretter en ny database på stedet som er oppgitt SQLALCHEMY_DATABASE_URI hvis en database ikke allerede eksisterer på den aktuelle plasseringen, ellers laster den applikasjonen sammen med samme database.

flask_app / my_app / Katalog / models.py

fra my_app import db klasse Produkt (db.Model): id = db.Column (db.Integer, primary_key = True) navn = db.Column (db.String (255)) price = db.Column (db.Float (asdecimal = True)) def __init __ (selv, navn, pris): self.name = navn self.price = pris def __repr __ (selv): retur ''% self.id

I filen ovenfor har jeg opprettet en veldig triviell modell for lagring av navn og pris på a Produkt. Dette vil lage en tabell i SQLite som svarer til detaljene i modellen.

flask_app / my_app / Katalog / views.py

import json fra kolbe import forespørsel, jsonify, Blueprint, abort fra flask.views import MethodView fra my_app import db, app fra my_app.catalog.models import Varekatalog = Blueprint ('katalog', __name__) @ catalog.route ('/' ) @ catalog.route ('/ home') def home (): returnere "Velkommen til Catalog Home." klasse ProductView (MethodView): def få (selv, id = Ingen, side = 1): Hvis ikke id: products = Product.query.paginate (side, 10) .items res =  for produkt i produkter: res .id] = 'navn': produkt.navn, 'pris': str (product.price), annet: produkt = Product.query.filter_by (id = id) .first () hvis ikke produkt: abort ) res = 'navn': produktnavn, 'pris': str (product.price), return jsonify (res) def post (selv): navn = request.form.get ('navn') pris = forespørsel .form.get ('pris') produkt = Produkt (navn, pris) db.session.add (produkt) db.session.commit () return jsonify (product.id: 'name': product.name, ' pris ': str (product.price)) def put (selv, id): # Oppdater posten for den oppgitte id # med detaljerte opplysninger. return def delete (selv, id): # Slett posten for det angitte ID. returnere product_view = ProductView.as_view ('product_view') app.add_url_rule ('/ produkt /', view_func = product_view, metoder = ['GET', 'POST']) app.add_url_rule ('/ produkt /', view_func = product_view, methods = [' GET '])

Hovedkjernen i denne opplæringen er behandlet i filen ovenfor. Kolbe gir et verktøy kalt pluggable visninger, som lar deg lage visninger i form av klasser i stedet for normalt som funksjoner. Metodebasert sending (MethodView) er en implementering av pluggable visninger som lar deg skrive metoder som svarer til HTTP-metodene i små bokstaver. I eksemplet ovenfor har jeg skriftlige metoder få() og post() som svarer til HTTPs og POST henholdsvis.

Ruting er også implementert på en annen måte, i de siste linjene i den ovennevnte filen. Vi kan spesifisere metodene som vil bli støttet av en bestemt regel. Ethvert annet HTTP-anrop vil bli oppfylt av Feil 405 Metode ikke tillatt.

Kjører programmet

For å kjøre programmet, utfør skriptet run.py. Innholdet i dette skriptet er:

fra appen min_app app app.run (debug = True)

Kjør nå bare fra kommandolinjen:

$ python run.py

For å sjekke om programmet fungerer, brann opp http://127.0.0.1:5000/ i nettleseren din, og en enkel skjerm med en velkomstmelding skal hilse på deg.

Testing av RESTful API

For å teste denne API-en, kan vi bare lage HTTP-anrop ved hjelp av en av de mange tilgjengelige metodene. GET-anrop kan gjøres direkte via nettleseren. POST-anrop kan gjøres ved hjelp av en Chrome-utvidelse som Postman eller fra kommandolinjen ved hjelp av curl, eller vi kan bruke python s forespørsler bibliotek for å gjøre jobben for oss. Jeg bruker forespørsel biblioteket her for demonstrasjonsformål.

La oss lage en ring først for å forsikre deg om at vi ikke har noen produkter opprettet enda. I henhold til RESTful APIs design, får du et kall som ser ut som noe /produkt/ bør liste alle produkter. Da vil jeg lage et par produkter ved å lage POST ringer til /produkt/ med noen data. Deretter en ring til /produkt/ bør liste opp alle produktene som er opprettet. For å hente et bestemt produkt, a ring til /produkt/ skal gjøre jobben. Nedenfor er et eksempel på alle anropene som kan gjøres ved hjelp av dette eksemplet.

$ pip installeringsforespørsler $ python >>> importforespørsler >>> r = requests.get ('http: // localhost: 5000 / product /') >>> r.json ()  >>> r = forespørsler. post ('http: // localhost: 5000 / product /', data = 'navn': 'iPhone 6s', 'pris': 699) >>> r.json () u'1 ': u 'pris': u'699.0000000000 ', navn': u'iPhone 6s ' >>> r = requests.post (' http: // localhost: 5000 / product / ', data = ' name ': 'iPad Pro', 'pris': 999) >>> r.json () u'2 ': u'price': u'999.0000000000 ', navn': u'iPad Pro '> >> r = requests.get ('http: // localhost: 5000 / product /') >>> r.json () u'1 ': u'price': u'699.0000000000 ' : u'iPhone 6s ', u'2': u'price ': u'999.0000000000', navn ': u'iPad Pro' >>> r = requests.get ('http: // localhost: 5000 / product / 1 ') >>> r.json () u'price': u'699.0000000000 ', navn': u'iPhone 6s '

Konklusjon

I denne veiledningen så du hvordan du lager RESTful-grensesnitt, selv ved hjelp av Flaskens pluggbare visningsverktøy. Dette er den mest fleksible tilnærmingen mens du skriver REST APIer, men innebærer mye mer kode som skal skrives. 

Det er utvidelser som gjør livet enklere og automatiserer implementeringen av RESTful APIer i stor grad. Jeg vil dekke disse i de neste par delene av denne opplæringsserien.