Python je jedním z nejsnáze čitelných a snadno zapisovatelných programovacích jazyků všech dob. V průběhu let se popularita Pythonu pouze zvýšila a je široce používán při vývoji webových aplikací, skriptování, vytváření her, vědeckých počítačích atd.
Flask je platforma webových aplikací Python, která si získává na popularitě díky snadnému použití pro začátečníky v jazyce Python. V tomto tutoriálu se podíváme na EVE, framework pro vytváření REST API založený na Flask, MongoDB a Redis. Z oficiálních dokumentů:
Využívá Flask, MongoDB, Redis a dobré úmysly Eve umožňuje bez námahy vytvářet a nasazovat vysoce přizpůsobitelné, plně funkční webové služby RESTful.
Co budeme tvořit
V tomto tutoriálu se podíváme, jak vytvořit rozhraní REST API pomocí rámce EVE. Dále pomocí AngularJS navrhneme frontend pro jednoduchou aplikaci a zfunkčníme ji využitím REST API vytvořených pomocí EVE. V tomto tutoriálu implementujeme následující funkce:
- Vytvořit uživatelské rozhraní API
- Ověřit uživatelské rozhraní API
- Add Items API
- Odstranit Items API
- Update Items API
Začínáme
Instalace
K instalaci EVE použijeme pip.
pip install eve
Budeme používat MongoDB
jako databáze. Podívejte se na oficiální dokumentaci k instalaci podle vašeho systému.
Vytvoření základního rozhraní API
Vytvořte složku projektu s názvem PythonAPI
. Přejděte do PythonAPI
a vytvořte soubor s názvem api.py
. Uvnitř api.py
importovat EVE
a vytvořte objekt EVE.
from eve import Eve app = Eve()
Dále spusťte app
když je program spuštěn jako hlavní program.
from eve import Eve app = Eve() if __name__ == '__main__': app.run()
Spusťte MongoDB
pomocí následujícího příkazu:
mongod --dbpath= <PATH-TO> /data/db/
Jak vidíte, musíme zadat cestu k souborům db. Jednoduše vytvořte data/db
ve vašem systému souborů a spusťte výše uvedený příkaz.
Spolu s instancí MongoDB
EVE vyžaduje konfigurační soubor s informacemi o zdrojích API. Tedy v PythonAPI
vytvořte další soubor s názvem settings.py
a přidejte následující kód:
DOMAIN = {'user': {}}
Výše uvedený kód informuje EVE, že zdroj pro user
je k dispozici.
Uložte všechny soubory a spusťte api.py
:
python api.py
Rozhraní API by mělo být online, jak je znázorněno:
K odesílání požadavků do rozhraní API budeme používat klienta Postman REST. Je zdarma a lze jej nainstalovat jednoduchým kliknutím. Po dokončení instalace spusťte aplikaci a zadejte adresu URL API (http://127.0.0.1:5000/) a klikněte na odeslat. Měli byste mít odpověď jako na obrázku:
Protože jsme nezavolali žádný konkrétní prostředek API, zobrazí se všechny dostupné prostředky. Nyní zkuste zavolat user
zdroj a měli byste mít odpověď specifickou pro user
.
Vytvoření a ověření uživatelského rozhraní API
Vytvořit uživatelské rozhraní API
Začneme vytvořením API pro vytvoření nebo registraci uživatele pro naši aplikaci. Uživatel bude mít určitá pole jako First Name
, Last Name
, Username
, Password
a Phone Number
.
Nejprve tedy budeme muset definovat schéma pro uživatele. Schéma definuje pole a datové typy klíčových polí. Otevřete settings.py
a upravte DOMAIN
definováním schématu, jak je znázorněno:
DOMAIN = { 'user': { 'schema': { 'firstname': { 'type': 'string' }, 'lastname': { 'type': 'string' }, 'username': { 'type': 'string', 'unique': True }, 'password': { 'type': 'string' }, 'phone': { 'type': 'string' } } } }
Jak můžete vidět ve výše uvedeném kódu, definovali jsme klíčová pole potřebná k vytvoření uživatele a jeho datový typ definovaný ve schématu. Uložte změny a spusťte api.py
. Z klienta Postman zkuste provést požadavek POST spolu s požadovanými parametry na http://127.0.0.1/user, jak je uvedeno:
Při požadavku POST na uživatele to vyhodilo 405 Method Not Allowed
chyba. Ve výchozím nastavení EVE přijímá pouze požadavky GET. Pokud chceme použít jinou metodu, musíme ji explicitně definovat. Otevřete settings.py
a definujte metody zdrojů, jak je uvedeno:
RESOURCE_METHODS = ['GET', 'POST']
Uložte změny a spusťte api.py
. Nyní zkuste znovu POST
uživateli a měli byste mít odpověď níže:
Jak můžete vidět, výše uvedený požadavek POST byl úspěšný. V našem settings.py
jsme nedefinovali konfigurace databáze , takže EVE dokončila požadavek pomocí spuštěné instance MongoDB
. Pojďme se přihlásit do MongoDB
shell a podívejte se na nově vytvořený záznam. Se spuštěnou instancí MongoDB spusťte mongo shell:
mongo
Jakmile jste uvnitř mongo
shell, seznam všech dostupných databází.
show databases;
Musí existovat eve
databáze. Přepněte na eve
databáze.
use eve;
Spusťte show
příkaz k výpisu tabulek uvnitř eve
databáze.
show tables;
Uvedené tabulky musí mít tabulku nazvanou user
. Seznam záznamů od user
tabulky pomocí následujícího příkazu:
db.user.find()
Zde jsou vybrané záznamy z uživatelských tabulek:
Ověřit uživatelské rozhraní API
Dále vytvoříme API pro ověření stávajícího uživatele. Normálně, když uděláme get
požadavek na koncový bod uživatele (http://127.0.0.1:5000/user), poskytne podrobnosti o všech registrovaných uživatelích z databáze. Zde musíme implementovat dvě věci. Nejprve musíme uživatele ověřit pomocí křestního jména a hesla a zadruhé musíme po úspěšném ověření vrátit údaje o uživateli z databáze.
Abychom získali podrobnosti na základě křestního jména, musíme přidat další vyhledávací pole do DOMAIN
v settings.py
.
'additional_lookup': { 'url': 'regex("[\w]+")', 'field': 'username', }
Jak je vidět ve výše uvedeném kódu, přidali jsme vyhledávací pole pro username
. Nyní, když je požadavek GET odeslán na http://127.0.0.1:5000/user/
<username>
vrátí podrobnosti o uživateli s konkrétním username
. Při požadavku konkrétnímu uživateli zašleme také username
a password
pro ověření.
Provedeme základní ověření, abychom ověřili konkrétního uživatele na základě uživatelského jména a hesla. Nejprve musíme importovat Basic Auth
třídy od EVE. Vytvořte třídu s názvem Authenticate
implementovat ověřování, jak je uvedeno:
from eve.auth import BasicAuth class Authenticate(BasicAuth): def check_auth(self, username, password, allowed_roles, resource, method):
Nyní, když je zdrojem user
a metoda požadavku je GET
, ověříme uživatele. Po úspěšné autentizaci budou vráceny uživatelské údaje uživatele s křestním jménem v koncovém bodu API. Rovněž omezíme vytváření uživatelů poskytnutím uživatelského jména a hesla. Pokud je tedy metoda POST a koncový bod API je uživatel, zkontrolujeme a ověříme uživatelské jméno a heslo. Zde je kompletní Authenticate
třída:
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
Musíme předat Authenticate
název třídy při spouštění API. Upravte tedy iniciační kód API, jak je znázorněno:
if __name__ == '__main__': app = Eve(auth=Authenticate) app.run()
Uložte všechny změny a spusťte api.py
. Zkuste odeslat základní požadavek na ověření s uživatelským jménem a heslem od Postman na http://127.0.0.1/user/username (uživatelské jméno nahraďte jakýmkoli jiným existujícím uživatelským jménem). Po úspěšné autentizaci byste měli v odpovědi obdržet podrobnosti o uživateli, jak je uvedeno:
Přidat, odstranit a aktualizovat položky
Add Item API
Abychom mohli vytvořit rozhraní API pro přidání položky, stačí vytvořit nové schéma pro položku v settings.py
.
'item': { 'schema': { 'name':{ 'type': 'string' }, 'username': { 'type': 'string' } } }
Add Item API by pomohlo každému přihlášenému uživateli přidat položku. Položku uložíme spolu s uživatelským jménem uživatele, který položku zadal. Uložte změny a zkuste provést požadavek POST na adresu http://127.0.0.1/item, jak je uvedeno:
Smazat Item API
Pro smazání položky vytvořené uživatelem stačí zavolat koncový bod položky /item_id
. Pouhým voláním požadavku DELETE se však položka nesmaže. Abychom mohli smazat položku, musíme také poskytnout _etag
související s konkrétní položkou. Jednou item id
a _etag
shoda, položka je smazána z databáze. Zde je návod, jak se v koncovém bodu položky volá metoda DELETE.
Aktualizovat rozhraní API položky
Update API je podobné jako Delete API. Jediné, co musíme udělat, je odeslat požadavek PATCH s item id
a _etag
a pole formuláře, která je třeba aktualizovat. Podrobnosti o položce se aktualizují takto: