sql >> Database >  >> NoSQL >> MongoDB

REST API's bouwen met EVE

Python is een van de meest gemakkelijk te lezen en gemakkelijk te schrijven programmeertalen aller tijden. In de loop der jaren is de populariteit van Python alleen maar toegenomen en wordt het veel gebruikt bij de ontwikkeling van webapplicaties, scripting, het maken van games, wetenschappelijke informatica, enz.

Flask is een Python-webtoepassingsframework dat aan populariteit wint vanwege het gebruiksgemak voor Python-beginners. In deze zelfstudie bekijken we EVE, een REST API-bouwraamwerk op basis van Flask, MongoDB en Redis. Uit de officiële documenten:

Aangedreven door Flask, MongoDB, Redis en goede bedoelingen maakt Eve het mogelijk om moeiteloos zeer aanpasbare, volledig functionele RESTful Web Service te bouwen en te implementeren.

Wat we gaan maken

In deze zelfstudie laten we zien hoe u REST-API's bouwt met behulp van het EVE-framework. Vervolgens zullen we met behulp van AngularJS de front-end ontwerpen voor een eenvoudige app en deze functioneel maken door de REST API's te gebruiken die zijn gebouwd met EVE. In deze tutorial zullen we de volgende functionaliteit implementeren:

  • Gebruikers-API maken
  • Gebruikers-API valideren
  • Items-API toevoegen
  • Items-API verwijderen
  • Update Items-API

Aan de slag

Installatie

We gebruiken pip om EVE te installeren.

pip install eve

We gebruiken MongoDB als databank. Bekijk de officiële documenten voor installatie volgens uw systeem.

De basis-API maken

Maak een projectmap met de naam PythonAPI . Navigeer naar PythonAPI en maak een bestand met de naam api.py . Binnen api.py importeer EVE en maak een EVE-object.

from eve import Eve
app = Eve()

Voer vervolgens app . uit wanneer het programma als hoofdprogramma wordt uitgevoerd.

from eve import Eve
app = Eve()

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

Voer uw MongoDB uit met het volgende commando:

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

Zoals u kunt zien, moeten we een pad opgeven voor de db-bestanden. Maak eenvoudig data/db in uw bestandssysteem en voer de bovenstaande opdracht uit.

Samen met een instantie van MongoDB actief is, vereist EVE een configuratiebestand met informatie over de API-bronnen. Dus in de PythonAPI map maak een ander bestand met de naam settings.py en voeg de volgende code toe:

DOMAIN = {'user': {}}

De bovenstaande code informeert EVE dat een bron voor user is beschikbaar.

Sla alle bestanden op en voer api.py . uit :

python api.py

De API moet online zijn zoals weergegeven:

We gebruiken Postman REST Client om verzoeken naar de API's te verzenden. Het is gratis en kan met een simpele klik worden geïnstalleerd. Als u klaar bent met installeren, start u de app en voert u de API-URL in (http://127.0.0.1:5000/) en klikt u op verzenden. U zou het antwoord moeten hebben zoals weergegeven:

Aangezien we geen specifieke API-resource hebben aangeroepen, worden alle beschikbare resources weergegeven. Probeer nu de user . te bellen bron en u zou het antwoord moeten hebben dat specifiek is voor de user .

Gebruikers-API maken en valideren

Gebruikers-API maken

We beginnen met het bouwen van een API om een ​​gebruiker voor onze applicatie aan te maken of te registreren. De gebruiker zou bepaalde velden hebben zoals First Name , Last Name , Username , Password en Phone Number .

Dus eerst moeten we een schema voor een gebruiker definiëren. Schema definieert de velden en gegevenstypen van de sleutelvelden. Open settings.py en wijzig het DOMAIN door een schema te definiëren zoals weergegeven:

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

Zoals u in de bovenstaande code kunt zien, hebben we de belangrijkste velden gedefinieerd die nodig zijn om een ​​gebruiker te maken en het gegevenstype dat in het schema is gedefinieerd. Sla de wijzigingen op en voer api.py uit . Probeer vanuit Postman Client een POST-verzoek te doen samen met de vereiste parameters naar http://127.0.0.1/gebruiker zoals weergegeven:

Op POST-verzoek aan de gebruiker gooide het een 405 Method Not Allowed fout. Standaard accepteert EVE alleen GET-verzoeken. Als we een andere methode willen gebruiken, moeten we deze expliciet definiëren. Open settings.py en definieer de bronmethoden zoals weergegeven:

RESOURCE_METHODS = ['GET', 'POST']

Sla de wijzigingen op en voer api.py uit . Probeer nu opnieuw om te POST aan de gebruiker en u zou het onderstaande antwoord moeten hebben:

Zoals u kunt zien, was het bovenstaande POST-verzoek succesvol. We hebben de databaseconfiguraties niet gedefinieerd in onze settings.py , dus EVE heeft het verzoek voltooid met de actieve instantie van MongoDB . Laten we inloggen op de MongoDB shell en bekijk de nieuw gemaakte record. Terwijl de MongoDB-instantie actief is, activeert u de mongo-shell:

mongo

Eenmaal binnen in de mongo shell, vermeld alle beschikbare databases.

show databases;

Er moet een eve . zijn databank. Schakel over naar de eve database.

use eve;

Voer de show uit commando om de tabellen binnen de eve . weer te geven database.

show tables;

De vermelde tabellen moeten een tabel hebben met de naam user . Maak een lijst van de records van de user tabel met het volgende commando:

db.user.find()

Dit zijn de geselecteerde records uit de gebruikerstabellen:

Gebruikers-API valideren

Vervolgens maken we een API om een ​​bestaande gebruiker te valideren. Normaal gesproken, als we een get . doen verzoek aan het gebruikerseindpunt (http://127.0.0.1:5000/user), geeft het details van alle geregistreerde gebruikers uit de database. We moeten hier twee dingen implementeren. Eerst moeten we een gebruiker authenticeren met behulp van voornaam en wachtwoord, en ten tweede moeten we de gebruikersgegevens uit de database retourneren na succesvolle authenticatie.

Om details te krijgen op basis van de voornaam, moeten we een extra opzoekveld toevoegen in het DOMAIN in settings.py .

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

Zoals te zien is in de bovenstaande code, hebben we een opzoekveld toegevoegd voor username . Wanneer nu een GET-verzoek wordt verzonden naar de http://127.0.0.1:5000/user/ <username> het zal de details van de gebruiker teruggeven met de specifieke username . Wanneer we een verzoek aan een bepaalde gebruiker doen, sturen we ook de username en password voor authenticatie.

We zullen basisverificatie uitvoeren om een ​​bepaalde gebruiker te verifiëren op basis van gebruikersnaam en wachtwoord. Eerst moeten we de Basic Auth . importeren klas van EVE. Maak een klasse met de naam Authenticate om de authenticatie te implementeren zoals getoond:

from eve.auth import BasicAuth

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

Nu, wanneer de bron user is en aanvraagmethode is GET , verifiëren we de gebruiker. Bij succesvolle authenticatie worden de gebruikersgegevens van de gebruiker met de voornaam in het API-eindpunt geretourneerd. We beperken ook het aanmaken van gebruikers door een gebruikersnaam en wachtwoord op te geven. Dus als de methode POST is en het API-eindpunt de gebruiker is, controleren en valideren we de gebruikersnaam en het wachtwoord. Dus hier is de volledige Authenticate klas:

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

We moeten de Authenticate . doorgeven klassenaam tijdens het starten van de API. Pas dus de API-initiatiecode aan zoals weergegeven:

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

Sla alle wijzigingen op en voer de api.py . uit . Probeer een eenvoudig verificatieverzoek met een gebruikersnaam en wachtwoord van Postman naar http://127.0.0.1/gebruiker/gebruikersnaam (vervang gebruikersnaam door een andere bestaande gebruikersnaam). Na succesvolle authenticatie, zou u de gebruikersgegevens als antwoord moeten krijgen, zoals weergegeven:

Items toevoegen, verwijderen en bijwerken 

Item-API toevoegen

Om een ​​API voor het toevoegen van een item te maken, hoeven we alleen maar een nieuw schema voor het item te maken in settings.py .

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

De Add Item API zou elke ingelogde gebruiker helpen om een ​​item toe te voegen. We slaan het item op samen met de gebruikersnaam van de gebruiker die het item heeft ingevoerd. Sla de wijzigingen op en probeer een POST-verzoek te doen naar http://127.0.0.1/item zoals weergegeven:

Item-API verwijderen

Voor het verwijderen van een item dat door een gebruiker is gemaakt, hoeven we alleen het item-eindpunt /item_id te bellen . Maar door simpelweg een DELETE-verzoek aan te roepen, wordt het item niet verwijderd. Om een ​​item te verwijderen, moeten we ook een _etag . opgeven gerelateerd aan een bepaald item. Eenmaal item id en _etag match, wordt het item uit de database verwijderd. Hier is hoe de DELETE-methode wordt aangeroepen in het item-eindpunt.

Item-API bijwerken

De Update API is vergelijkbaar met de Delete API. Het enige wat we hoeven te doen is een PATCH-verzoek sturen met de item id en _etag en de formuliervelden die moeten worden bijgewerkt. Hier is hoe de itemdetails worden bijgewerkt:


  1. Een groot aantal records in een verzameling bijwerken

  2. Voorwaardelijke $ som in MongoDB

  3. Hoe verwijder ik alles in Redis?

  4. Hoe maak je een DB voor MongoDB-container bij het opstarten?