So erstellen Sie eine REST-API in Python mit dem Flask Microframework


BILDNACHWEIS: Edmond Atto

Eine API (Application Programming Interface) kann als ein Satz klar definierter Kommunikationsmethoden zwischen verschiedenen Softwarekomponenten definiert werden.
Wikipedia

Flasche andererseits ist a Python Mikro-Framework, das zur Entwicklung von Webanwendungen verwendet wird.

Ich habe eine gebaut API um eine Anwendung namens BucketList. Die Anwendung ermöglicht es einem Benutzer CHaftung Rlesen, Update und Delete(CRUD) einen Bucket und die darin enthaltenen Elemente. In diesem Artikel werde ich den Prozess beschreiben, den ich während der Entwicklung der API durchlaufen habe, und ich werde ein paar Code-Snippets nur zu Beispielzwecken teilen. Der Code lebt weiter GitHub und du kannst es finden hier.

Die anfängliche Ordnerstruktur

api/ 
  |- app 
    |- auth 
    |- bucket 
    |- bucketitems 
    |- __init__.py 
    |- config.py 
    |- models.py 
    |- views.py 
 |- .gitignore 
 |- manage.py 
 |- run.py 
 |- requirements.txt 
 |- README.md

Oben ist meine anfängliche Ordnerstruktur mit api als Name des Anwendungsordners. Die Anwendungslogik befindet sich in der app Mappe. Im App-Ordner befinden sich drei Flaschen Blaupausenauth, Bucket und Bucketitems.

  • Der Auth-Blueprint enthält die Logik für die Anwendungsauthentifizierung und -autorisierung
  • Der Bucket-Blueprint enthält die Logik zum Tragen von Bucket-CRUD-Operationen.
  • Der Bucketitems-Blueprint enthält die Bucket-Items-CRUD-Operationen.

Untersuchen der Dateistruktur

  1. Das __init__.py enthält den Code zum Einrichten der Flask-Anwendung und zum Registrieren der verschiedenen Blueprints in der Anwendungsinstanz.
  2. Das config.py Datei enthält die verschiedenen Anwendungskonfigurationsoptionen, die Test, Entwicklung und Produktion sind. Je nach Umgebung, in der die Anwendung ausgeführt wird, wird eine andere Konfiguration verwendet.
  3. Das models.py Datei enthält die verschiedenen Datenbankmodelle, users , buckets , bucketitems und die anderen Modelle.
  4. Das views.py enthält die anwendungsweiten Routen.
  5. Das .gitignore Datei enthält die Dateien, die nicht hinzugefügt und von der verfolgt werden sollen Versionskontrollsystem(VCS) in diesem Fall Git.
  6. Das manage.py Datei enthält die von Ihnen definierten und von der zur Verfügung gestellten Anwendungsbefehle Flask-Script Verlängerung.
  7. Das requirements.txt Datei enthält einen Verweis auf die Anwendungserweiterungen und ihre Versionen. Es wird durch Laufen erzeugt pip freeze > requirements.txt im Endgerät.
  8. Das README.md Markdown-Datei enthält alle Beschreibungen oder Informationen, die der Entwickler den Anwendungsbenutzern zur Verfügung stellt.

Testgetriebene Entwicklung

Testgetriebene Entwicklung(TDD) ist eine bewährte Vorgehensweise beim Schreiben von Code. Meiner Erfahrung nach ermöglicht es Ihnen, über die verschiedenen Aspekte der Codefunktionalität nachzudenken, die Sie schreiben werden, und dann im Voraus Tests zu entwickeln, bevor Sie die Featurefunktionalität schreiben. Später schreiben Sie den Code und stellen sicher, dass Ihre zuvor fehlgeschlagenen Tests bestehen. Falls Sie später etwas in Ihrem Code ändern, führen Sie einfach Ihre Tests durch und stellen Sie sicher, dass nichts beschädigt ist. Wenn sie fehlschlagen, wissen Sie, dass Sie einen Fehler beheben müssen.

Während der Entwicklung der API habe ich TDD in einigen Teilen der Implementierung praktiziert. Später habe ich weitergemacht und Tests geschrieben, die mindestens 97 % des gesamten Codes, den ich geschrieben habe, abdecken.

Ich habe eine Flask-Erweiterung namens Flaschentest für das Schreiben aller meiner Anwendungstests und ich führe die Tests mit einem Python-Paket namens aus Nase.


Tokenbasierte Authentifizierung

Die gesamte API-Authentifizierung wird mithilfe von a erstellt Json-Web-Token(JWT)-basiertes Authentifizierungssystem. JWT-Token bieten eine Möglichkeit, Ansprüche zwischen zwei Parteien sicher darzustellen.

Ich habe ein Python-Paket namens Aufhören zum Codieren und Decodieren von JWTs. Wenn sich ein Benutzer anmeldet oder anmeldet, wird ihm ein Token zugewiesen. Dieses Token verfällt nach einer bestimmten Zeit oder wenn sich der Benutzer abmeldet. Wenn sich der Benutzer abmeldet, wird das Token ungültig gemacht, auf die Blacklist gesetzt und der Blacklist-Tabelle in der Datenbank hinzugefügt.

Da auf die meisten API-Ressourcen nur authentifizierte Benutzer zugreifen sollten. Ich habe eine erstellt Dekorateur ansehen auf allen Routen zu verwenden, die einen authentifizierten Benutzer erfordern.


Versionskontrolle

Bei der Versionskontrolle geht es, wie der Name schon sagt, darum, die verschiedenen Versionen der Anwendung während ihrer Entwicklung zu kontrollieren. Git ist wahrscheinlich das gebräuchlichste und am einfachsten zu verwendende Versionskontrolltool bei der Entwicklung einer Anwendung.

Für den größten Teil der Entwicklung habe ich die verwendet (simuliert). Gitflow-Workflow. Dieser Workflow schlägt vor, dass Sie eine erstellen develop Abzweigung von der master verzweigen und dann erstellen feature zweigt vom Entwicklungszweig ab. Die wichtigste Erkenntnis aus diesem Workflow ist, dass die master Der Zweig sollte nur “funktionierenden” Code enthalten (Code bereit für die Veröffentlichung).

Ich habe auch Github P verwendetvolle Anfragen(PR), damit meine Kollegen meinen Code überprüfen und kommentieren konnten, bevor ich ihn in die einfügen konnte develop Zweig.


Datenpersistenz

Wie Sie wissen, müssen die meisten Anwendungen Benutzerdaten auf die eine oder andere Weise speichern. Meine API verwendet a postgresql Datenbank, um die Daten der Benutzer beizubehalten, insbesondere die Anmeldedaten der Benutzer, Buckets und ihre Elemente.

Ich habe die verwendet Kolben-Sqlalchemie Erweiterung, um mit der Datenbank zu interagieren. Dies ermöglichte mir im Grunde, die Modellklassen user, Bucket und Bucket-Items zu erstellen.

Ich habe auch die verwendet Flask-Migration Erweiterung zum Erstellen von Migrationen für die Datenbank. Datenbankmigrationen sind wie eine „Versionskontrolle“ für das Datenbankschema.

Ich habe eine andere Erweiterung verwendet Fälschungpy um Dummy-Daten für die Anwendung zu erstellen, damit ich einige Funktionen testen konnte, wie z api-pagination die etwas viel Daten erfordern.


Aufbau

Die API wird in drei Umgebungen ausgeführt development , testing und production . Um Konfigurationen zwischen diesen verschiedenen Umgebungen umzuschalten, habe ich eine erstellt config.py Datei, um all die verschiedenen Variablen für jede Umgebung zu handhaben.

Die aktive Konfiguration wird vom verwaltet APP_SETTING Konfigurationsvariable, die je nach Umgebung auf eine der drei Konfigurationen gesetzt wird.


Kontinuierliche Integration

Ich bin neu im gesamten Konzept der kontinuierlichen Integration (CI), daher werde ich nur auf ein Tool hinweisen (Travis C.I), die ich während der Entwicklung verwendet habe.

Ich habe Travis verwendet, um meine Builds auszuführen, wenn ich ein Commit, einen Branch oder eine PR durchgeführt habe. Travis ermöglichte mir auch durch die .travis.yml Datei, um eine Postgres-Datenbank einzurichten, sodass beim Ausführen der Tests keine Fehler für die Tests auftreten, die eine Datenbank erfordern. Nach erfolgreicher Durchführung der Tests wurden die Abdeckungsdetails an gesendet Overalls zur weiteren Analyse.


Hinzufügen von Abzeichen zu Ihrem Repository

Repository-Badges haben mich während der Entwicklung geleitet und auch motiviert. Ich habe die Travis, Abdeckung (Overalls) hinzugefügt, BetterCode und CodacyAbzeichen.

  • Das Travis-Abzeichen zeigte an, ob der Build bestanden oder fehlgeschlagen war
  • Das Abdeckungs-Badge zeigte die prozentuale Abdeckung des Tests
  • Bettercode zeigte die Qualität des Codes anhand von zehn Attributen an
  • Das Codacy-Abzeichen zeigte die allgemeine Qualität des Codes.

API-Dokumentation

Die meisten der APIs, die ich zuvor verwendet habe, haben eine Art Anleitung, wie man sie benutzt, und das machte es für mich einfach und unkompliziert, sie auszuprobieren. Ich hatte das Bedürfnis, mich für den Gefallen zu revanchieren, indem ich Dokumentation für meine API mit einem Tool namens schrieb Bienenhaus und es mit der API als gehostet Startseite Sie können es live ausprobieren.


Endgültige Ordnerstruktur

Während der Entwicklung hat sich viel geändert, ebenso die Struktur der Anwendungsordner. Am Ende der Entwicklung hat sich meine Ordnerstruktur wie folgt geändert.

api/ 
  |- app 
    	|- auth 
        |- bucket 
        |- bucketitems 
        |- docs 
        	|- static 
            	|- js 
                	|- apairy.js 
                |- favicon 
            |- templates 
            	|- docs 
                	|- index.html 
        |- __init__.py 
        |- config.py 
        |- models.py 
        |- views.py 
  	|- migrations 
    |- tests 
    |- .coveralls.yml 
    |- .travis.yml 
    |- run.py 
    |- Procfile 
    |- .gitignore 
    |- manage.py 
    |- requirements.txt 
    |- README.md

Ich habe ein hinzugefügt docs Blaupause für alles, was mit der API-Dokumentation zu tun hat, einschließlich der apiary.js Datei, die den Einbettungscode für die Apiary-API-Dokumentation, das Website-Favicon und die index.html Datei.

Das tests Ordner enthielt die Anwendungstests, migrations Der Ordner enthielt die Modellmigrationsdateien und die Procfile enthielt die Heroku Konfigurationen.

Gastgeber

Schließlich musste ich nach der Entwicklung meine API bereitstellen. Ich habe mich entschieden, meine Anwendung bei zu hosten Heroku Dies ist eine Plattform, die es ermöglicht, Anwendungen zu hosten, die in einer Vielzahl von Programmiersprachen geschrieben sind.

Das Procfile in der obigen Ordnerstruktur waren die Konfigurationen enthalten, die es Heroku ermöglichten, die Anwendung auszuführen. Diese Konfigurationen enthalten die gunicorn server config und config zum Erstellen der Datenbanktabellen.

Sie finden meinen Beitrag zum Hosten dieser API auf Heroku hier .

Die API ist verfügbar hier du kannst es testen.

Der gesamte Code wird gehostet hier.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *