Python er et af de mest letlæselige og nemme at skrive programmeringssprog nogensinde. I årenes løb er Pythons popularitet kun steget, og det er meget udbredt til udvikling af webapplikationer, scripting, skabelse af spil, videnskabelig databehandling osv.
Flask er en Python-webapplikationsramme, som vinder popularitet på grund af dens brugervenlighed for Python-begyndere. I denne tutorial vil vi se på EVE, en REST API-bygningsramme baseret på Flask, MongoDB og Redis. Fra de officielle dokumenter:
Drevet af Flask, MongoDB, Redis og gode hensigter Eve tillader ubesværet at bygge og implementere meget tilpasselig, fuldt udstyret RESTful Web Service.
Hvad vi vil skabe
I dette selvstudie vil vi se, hvordan du opbygger REST API'er ved hjælp af EVE-rammen. Dernæst vil vi ved hjælp af AngularJS designe frontenden til en simpel app og gøre den funktionel ved at bruge REST API'erne bygget ved hjælp af EVE. I denne øvelse implementerer vi følgende funktionalitet:
- Opret bruger-API
- Valider User API
- Add Items API
- Slet Items API
- Opdater Items API
Kom godt i gang
Installation
Vi bruger pip til at installere EVE.
pip install eve
Vi bruger MongoDB
som database. Tag et kig på de officielle dokumenter til installation i henhold til dit system.
Oprettelse af Basic API
Opret en projektmappe kaldet PythonAPI
. Naviger til PythonAPI
og opret en fil kaldet api.py
. Inde i api.py
importer EVE
og opret et EVE-objekt.
from eve import Eve app = Eve()
Kør derefter app
når programmet køres som et hovedprogram.
from eve import Eve app = Eve() if __name__ == '__main__': app.run()
Kør din MongoDB
ved at bruge følgende kommando:
mongod --dbpath= <PATH-TO> /data/db/
Som du kan se, skal vi angive en sti til db-filerne. Du skal blot oprette data/db
i dit filsystem og kør kommandoen ovenfor.
Sammen med en forekomst af MongoDB
kører, kræver EVE en konfigurationsfil med information om API-ressourcerne. Så i PythonAPI
mappe oprette en anden fil kaldet settings.py
og tilføj følgende kode:
DOMAIN = {'user': {}}
Ovenstående kode informerer EVE om, at en ressource for bruger
er tilgængelig.
Gem alle filerne og kør api.py
:
python api.py
API'et skal være online som vist:
Vi bruger Postman REST Client til at sende anmodninger til API'erne. Det er gratis og kan installeres med et enkelt klik. Når du er færdig med installationen, skal du starte appen og indtaste API-URL'en (http://127.0.0.1:5000/) og klikke på send. Du skal have svaret som vist:
Da vi ikke har kaldt nogen specifik API-ressource, vil den vise alle de tilgængelige ressourcer. Prøv nu at ringe til brugeren
ressource, og du bør have svaret specifikt for brugeren
.
Opret og valider bruger-API
Opret bruger-API
Vi starter med at bygge en API for at oprette eller registrere en bruger til vores applikation. Brugeren vil have visse felter som Fornavn
, Efternavn
, Brugernavn
, Adgangskode
og Telefonnummer
.
Så først bliver vi nødt til at definere et skema for en bruger. Skema definerer felterne og datatyperne for nøglefelterne. Åbn settings.py
og rediger DOMAIN
ved at definere et skema som vist :
DOMAIN = { 'user': { 'schema': { 'firstname': { 'type': 'string' }, 'lastname': { 'type': 'string' }, 'username': { 'type': 'string', 'unique': True }, 'password': { 'type': 'string' }, 'phone': { 'type': 'string' } } } }
Som du kan se i ovenstående kode, har vi defineret de nøglefelter, der er nødvendige for at oprette en bruger, og dens datatype defineret i skemaet. Gem ændringerne, og kør api.py
. Prøv at lave en POST-anmodning fra Postman Client sammen med de nødvendige parametre til http://127.0.0.1/user som vist:
På POST-anmodning til brugeren sendte den en 405-metode ikke tilladt
fejl. Som standard accepterer EVE kun GET-anmodninger. Hvis vi vil bruge en anden metode, skal vi definere det eksplicit. Åbn settings.py
og definer ressourcemetoderne som vist :
RESOURCE_METHODS = ['GET', 'POST']
Gem ændringerne, og kør api.py
. Prøv nu igen at POST
til bruger, og du skal have nedenstående svar:
Som du kan se, var ovenstående POST-anmodning vellykket. Vi har ikke defineret databasekonfigurationerne i vores settings.py
, så EVE fuldførte anmodningen ved at bruge den kørende instans af MongoDB
. Lad os logge ind på MongoDB
shell og se den nyoprettede post. Mens MongoDB-instansen kører, udløser du mongo-skallen:
mongo
Når du er inde i mongo
shell, skal du liste alle de tilgængelige databaser.
show databases;
Der skal være en eve
database. Skift til eve
database.
use eve;
Udfør show
kommando for at liste tabellerne inde i eve
database.
show tables;
De anførte tabeller skal have en tabel kaldet bruger
. Liste registreringerne fra brugeren
tabel ved hjælp af følgende kommando:
db.user.find()
Her er de valgte poster fra brugertabellerne:
Valider User API
Dernæst opretter vi en API for at validere en eksisterende bruger. Normalt, hvis vi laver en get
anmodning til brugerens slutpunkt (http://127.0.0.1:5000/bruger), vil det give oplysninger om alle registrerede brugere fra databasen. Vi skal implementere to ting her. Først skal vi godkende en bruger ved hjælp af fornavn og adgangskode, og for det andet skal vi returnere brugeroplysningerne fra databasen efter vellykket godkendelse.
For at få detaljer baseret på fornavnet skal vi tilføje et ekstra opslagsfelt i DOMÆNE
i settings.py
.
'additional_lookup': { 'url': 'regex("[\w]+")', 'field': 'username', }
Som det ses i ovenstående kode, har vi tilføjet et opslagsfelt for brugernavn
. Når nu en GET-anmodning sendes til http://127.0.0.1:5000/user/
brugernavn
. Når vi sender en anmodning til en bestemt bruger, sender vi også brugernavnet
og adgangskode
til godkendelse.
Vi laver grundlæggende godkendelse for at bekræfte en bestemt bruger baseret på brugernavn og adgangskode. Først skal vi importere Basic Auth
klasse fra EVE. Opret en klasse kaldet Authenticate
for at implementere godkendelsen som vist:
from eve.auth import BasicAuth class Authenticate(BasicAuth): def check_auth(self, username, password, allowed_roles, resource, method):
Nu, når ressourcen er bruger
og anmodningsmetoden er GET
, godkender vi brugeren. Ved vellykket godkendelse returneres brugeroplysningerne for brugeren med fornavn i API-slutpunktet. Vi vil også begrænse brugeroprettelse ved at angive et brugernavn og en adgangskode. Så hvis metoden er POST, og API-endepunktet er bruger, kontrollerer og validerer vi brugernavnet og adgangskoden. Så her er den komplette Godkend
klasse:
class Authenticate(BasicAuth): def check_auth(self, username, password, allowed_roles, resource, method): if resource == 'user' and method == 'GET': user = app.data.driver.db['user'] user = user.find_one({'username': username,'password':password}) if user: return True else: return False elif resource == 'user' and method == 'POST': return username == 'admin' and password == 'admin' else: return True
Vi skal videregive Authenticate
klassenavn, mens API'en startes. Så modificer API-initieringskoden som vist:
if __name__ == '__main__': app = Eve(auth=Authenticate) app.run()
Gem alle ændringerne og udfør api.py
. Prøv at sende en grundlæggende godkendelsesanmodning med et brugernavn og en adgangskode fra Postman til http://127.0.0.1/user/username (erstat brugernavnet med et hvilket som helst andet eksisterende brugernavn). Ved vellykket godkendelse bør du få brugeroplysningerne som svar som vist:
Tilføj, slet og opdater elementer
Tilføj Item API
For at kunne oprette en Tilføj element API er alt, hvad vi skal gøre, at oprette et nyt skema for element i settings.py
.
'item': { 'schema': { 'name':{ 'type': 'string' }, 'username': { 'type': 'string' } } }
Add Item API'en vil hjælpe hver logget ind bruger med at tilføje et element. Vi gemmer elementet sammen med brugernavnet på den bruger, der indtastede elementet. Gem ændringerne, og prøv at lave en POST-anmodning til http://127.0.0.1/item som vist:
Slet Item API
For at slette et element, der er oprettet af en bruger, skal vi blot kalde elementets slutpunkt /item_id
. Men blot at kalde en DELETE-anmodning vil ikke slette elementet. For at slette et element skal vi også angive et _etag
relateret til en bestemt vare. En gang item id
og _etag
match, slettes elementet fra databasen. Her er, hvordan DELETE-metoden kaldes i item endpoint.
Opdater Item API
Update API ligner Slet API. Alt vi skal gøre er at sende en PATCH-anmodning med item id
og _etag
og formularfelterne, som skal opdateres. Sådan opdateres vareoplysningerne: