MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Erstellen von REST-APIs mit EVE

Python ist eine der am einfachsten zu lesenden und am einfachsten zu schreibenden Programmiersprachen aller Zeiten. Im Laufe der Jahre hat die Popularität von Python nur zugenommen und es wird häufig in der Entwicklung von Webanwendungen, beim Skripting, beim Erstellen von Spielen, beim wissenschaftlichen Rechnen usw. verwendet.

Flask ist ein Framework für Python-Webanwendungen, das aufgrund seiner Benutzerfreundlichkeit für Python-Anfänger immer beliebter wird. In diesem Tutorial werfen wir einen Blick auf EVE, ein Framework zum Erstellen von REST-APIs, das auf Flask, MongoDB und Redis basiert. Aus den offiziellen Dokumenten:

Unterstützt von Flask, MongoDB, Redis und guten Absichten ermöglicht Eve die mühelose Erstellung und Bereitstellung hochgradig anpassbarer, voll ausgestatteter RESTful-Webdienste.

Was wir erstellen werden

In dieser Anleitung erfahren Sie, wie Sie REST-APIs mit dem EVE-Framework erstellen. Als Nächstes entwerfen wir mit AngularJS das Frontend für eine einfache App und machen es funktionsfähig, indem wir die mit EVE erstellten REST-APIs nutzen. In diesem Tutorial implementieren wir die folgende Funktionalität:

  • Benutzer-API erstellen
  • Benutzer-API validieren
  • Elemente-API hinzufügen
  • API zum Löschen von Elementen
  • Elemente-API aktualisieren

Erste Schritte

Installation

Wir werden pip verwenden, um EVE zu installieren.

pip install eve

Wir verwenden MongoDB als Datenbank. Werfen Sie einen Blick auf die offiziellen Dokumente zur Installation gemäß Ihrem System.

Erstellen der Basis-API

Erstellen Sie einen Projektordner namens PythonAPI . Navigieren Sie zu PythonAPI und erstellen Sie eine Datei namens api.py . Innerhalb von api.py importiere EVE und erstelle ein EVE-Objekt.

from eve import Eve
app = Eve()

Führen Sie als Nächstes app aus wenn das Programm als Hauptprogramm ausgeführt wird.

from eve import Eve
app = Eve()

if __name__ == '__main__':
    app.run()

Führen Sie Ihre MongoDB aus mit dem folgenden Befehl:

mongod --dbpath= <PATH-TO> /data/db/

Wie Sie sehen können, müssen wir einen Pfad für die db-Dateien angeben. Erstellen Sie einfach data/db in Ihrem Dateisystem und führen Sie den obigen Befehl aus.

Zusammen mit einer Instanz von MongoDB läuft, benötigt EVE eine Konfigurationsdatei mit Informationen über die API-Ressourcen. Also in der PythonAPI Ordner eine weitere Datei namens settings.py erstellen und fügen Sie den folgenden Code hinzu:

DOMAIN = {'user': {}}

Der obige Code informiert EVE darüber, dass eine Ressource für user ist verfügbar.

Speichern Sie alle Dateien und führen Sie api.py aus :

python api.py

Die API sollte wie gezeigt online sein:

Wir verwenden den Postman REST Client, um Anfragen an die APIs zu senden. Es ist kostenlos und kann mit einem einfachen Klick installiert werden. Starten Sie nach Abschluss der Installation die App, geben Sie die API-URL (http://127.0.0.1:5000/) ein und klicken Sie auf Senden. Sie sollten die folgende Antwort erhalten:

Da wir keine bestimmte API-Ressource aufgerufen haben, werden alle verfügbaren Ressourcen angezeigt. Versuchen Sie nun, user anzurufen Ressource und Sie sollten die Antwort speziell für den user haben .

Benutzer-API erstellen und validieren

Benutzer-API erstellen

Wir beginnen mit dem Erstellen einer API, um einen Benutzer für unsere Anwendung zu erstellen oder zu registrieren. Der Benutzer hätte bestimmte Felder wie First Name , Last Name , Username , Password und Phone Number .

Also müssen wir zuerst ein Schema für einen Benutzer definieren. Schema definiert die Felder und Datentypen der Schlüsselfelder. Öffnen Sie settings.py und ändern Sie die DOMAIN indem Sie ein Schema wie gezeigt definieren:

DOMAIN = {
    'user': {
        'schema': {
            'firstname': {
                'type': 'string'
            },
            'lastname': {
                'type': 'string'
            },
            'username': {
                'type': 'string',
                 'unique': True
            },
            'password': {
                'type': 'string'
            },
            'phone': {
                'type': 'string'
            }
        }
    }
}

Wie Sie im obigen Code sehen können, haben wir die Schlüsselfelder definiert, die zum Erstellen eines Benutzers und seines im Schema definierten Datentyps erforderlich sind. Speichern Sie die Änderungen und führen Sie api.py aus . Versuchen Sie vom Postman-Client, eine POST-Anforderung zusammen mit den erforderlichen Parametern an http://127.0.0.1/user zu senden, wie gezeigt:

Bei einer POST-Anforderung an den Benutzer wurde ein 405 Method Not Allowed ausgelöst Error. Standardmäßig akzeptiert EVE nur GET-Anfragen. Wenn wir eine andere Methode verwenden möchten, müssen wir sie explizit definieren. Öffnen Sie settings.py und definieren Sie die Ressourcenmethoden wie gezeigt:

RESOURCE_METHODS = ['GET', 'POST']

Speichern Sie die Änderungen und führen Sie api.py aus . Versuchen Sie nun erneut, POST zu senden an den Benutzer und Sie sollten die folgende Antwort erhalten:

Wie Sie sehen können, war die obige POST-Anfrage erfolgreich. Wir haben die Datenbankkonfigurationen nicht in unserer settings.py definiert , also hat EVE die Anfrage mit der laufenden Instanz von MongoDB abgeschlossen . Melden wir uns bei MongoDB an Shell und sehen Sie sich den neu erstellten Datensatz an. Lösen Sie bei laufender MongoDB-Instanz die Mongo-Shell aus:

mongo

Einmal im mongo Shell alle verfügbaren Datenbanken auflisten.

show databases;

Es muss einen eve geben Datenbank. Wechseln Sie zu eve Datenbank.

use eve;

Führen Sie die show aus Befehl, um die Tabellen in eve aufzulisten Datenbank.

show tables;

Die aufgelisteten Tabellen müssen eine Tabelle namens user haben . Listen Sie die Datensätze des user auf Tabelle mit dem folgenden Befehl:

db.user.find()

Hier sind die ausgewählten Datensätze aus den Benutzertabellen:

Benutzer-API validieren

Als Nächstes erstellen wir eine API, um einen vorhandenen Benutzer zu validieren. Normalerweise, wenn wir ein get machen Anfrage an den Benutzerendpunkt (http://127.0.0.1:5000/user), gibt er Details aller registrierten Benutzer aus der Datenbank aus. Hier müssen wir zwei Dinge umsetzen. Erstens müssen wir einen Benutzer mit Vorname und Passwort authentifizieren und zweitens müssen wir die Benutzerdetails bei erfolgreicher Authentifizierung aus der Datenbank zurückgeben.

Um Details basierend auf dem Vornamen zu erhalten, müssen wir ein zusätzliches Nachschlagefeld in der DOMAIN hinzufügen in settings.py .

'additional_lookup': {
            'url': 'regex("[\w]+")',
            'field': 'username',
            }

Wie im obigen Code zu sehen, haben wir ein Nachschlagefeld für username hinzugefügt . Wenn jetzt eine GET-Anfrage an http://127.0.0.1:5000/user/ gesendet wird <username> es gibt die Details des Benutzers mit dem bestimmten username zurück . Wenn Sie eine Anfrage an einen bestimmten Nutzer stellen, senden wir auch den username und Password zur Authentifizierung.

Wir führen eine einfache Authentifizierung durch, um einen bestimmten Benutzer basierend auf Benutzername und Passwort zu verifizieren. Zuerst müssen wir den Basic Auth importieren Klasse von EVE. Erstellen Sie eine Klasse namens Authenticate um die Authentifizierung wie gezeigt zu implementieren:

from eve.auth import BasicAuth

class Authenticate(BasicAuth):
    def check_auth(self, username, password, allowed_roles, resource,
                   method):
                   

Nun, wenn die Ressource user ist und die Anfragemethode ist GET , authentifizieren wir den Benutzer. Bei erfolgreicher Authentifizierung werden die Benutzerdetails des Benutzers mit dem Vornamen im API-Endpunkt zurückgegeben. Wir schränken auch die Benutzererstellung ein, indem wir einen Benutzernamen und ein Passwort angeben. Wenn also die Methode POST und der API-Endpunkt user ist, prüfen und validieren wir den Benutzernamen und das Passwort. Hier ist also die vollständige Authenticate 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

Wir müssen den Authenticate übergeben Klassenname beim Initiieren der API. Ändern Sie also den API-Initiierungscode wie gezeigt:

if __name__ == '__main__':
    app = Eve(auth=Authenticate)
    app.run()

Speichern Sie alle Änderungen und führen Sie api.py aus . Versuchen Sie, eine einfache Authentifizierungsanfrage mit einem Nutzernamen und einem Passwort von Postman an http://127.0.0.1/user/username zu senden (ersetzen Sie den Nutzernamen durch einen anderen vorhandenen Nutzernamen). Bei erfolgreicher Authentifizierung sollten Sie die Benutzerdetails wie gezeigt als Antwort erhalten:

Elemente hinzufügen, löschen und aktualisieren 

Element-API hinzufügen

Um eine API zum Hinzufügen von Artikeln zu erstellen, müssen wir lediglich ein neues Schema für den Artikel in settings.py erstellen .

'item': {
        'schema': {
            'name':{
                'type': 'string'
                },
            'username': {
                'type': 'string'
                }
            }
        }

Die API zum Hinzufügen von Artikeln würde jedem angemeldeten Benutzer helfen, einen Artikel hinzuzufügen. Wir speichern das Element zusammen mit dem Benutzernamen des Benutzers, der das Element eingegeben hat. Speichern Sie die Änderungen und versuchen Sie, eine POST-Anfrage an http://127.0.0.1/item zu senden, wie hier gezeigt:

Element-API löschen

Um ein von einem Benutzer erstelltes Element zu löschen, müssen wir lediglich den Elementendpunkt /item_id aufrufen . Das einfache Aufrufen einer DELETE-Anforderung löscht das Element jedoch nicht. Um ein Element zu löschen, müssen wir auch einen _etag angeben auf einen bestimmten Artikel bezogen. Einmal item id und _etag übereinstimmen, wird das Element aus der Datenbank gelöscht. So wird die DELETE-Methode im Elementendpunkt aufgerufen.

Element-API aktualisieren

Die Update-API ähnelt der Delete-API. Alles, was wir tun müssen, ist eine PATCH-Anfrage mit der item id zu senden und _etag und die Formularfelder, die aktualisiert werden müssen. So werden die Artikeldetails aktualisiert: