Einführung
In meiner Arbeit verwende ich seit einiger Zeit Flask-Potion , ein Framework, dessen Hauptvorteile darin bestehen: sehr bequeme Integration in SQLAlchemy-Modelle, automatische Generierung von Rohendpunkten, Anwesenheit eines Potion -Clients (sehr praktisch, wenn Sie einen API-Service schreiben, den Sie in einem anderen verwenden müssen Service).
Mir ist aufgefallen, dass Flaschentrank auf Russisch fast nichts ist, aber ich denke, dass dieser Rahmen für manche interessant erscheint.
Anstelle eines einfachen Übersichtsartikels zu diesem Framework habe ich beschlossen, mehrere Artikel zum Erstellen eines Steuerungssystems für die Furfur-Bibliothek auf der Basis von Flask-Potion zu schreiben.
Dieses System sollte in der Lage sein, Folgendes zu tun:
- Informationen über Bücher speichern (isbn, Titel, Beschreibung, Autor usw.)
- Benutzerinformationen speichern (Leser und Bibliothekare)
- Ausgabe eines Buches aus der Bibliothek für einen bestimmten Zeitraum mit der Möglichkeit der Erweiterung
In diesem System werden wir die folgenden Werkzeuge verwenden:
- PostgreSQL
- Flask, Flask-SQLAlchemy, Flask-JWT, Flask-Potion, Flask-Migrate
Vorbereitung
Skelett
Um das Skelett für das Projekt nicht selbst zu sammeln, verwenden wir die Valefor-Cookie-Cutter-Vorlage, die alle oben genannten Abhängigkeiten und noch mehr enthält.
cookiecutter gh:lemegetonx/valefor
Diese Vorlage enthält zwei Anwendungen:
- App ist die Hauptsache. Es enthält Handlerfunktionen für JWT, Mixin-Klassen für Trankressourcen und SQLalchemie-Modelle sowie ein Paket mit Konfigurationen für die Anwendung.
- Benutzer - Enthält zu Beginn der Vorlage nur das Benutzermodell.
Abhängigkeitsinstallation
Die Vorlage verwendet Poesie, um Abhängigkeiten aufzulösen. In letzter Zeit unterstützt pip jedoch auch pyproject.toml , sodass Sie die Wahl haben. Ich werde die Poesie ausnutzen.
poetry install
Konfiguration
Für eine vereinfachte Konfiguration verwendet die Vorlage die Sitri-Bibliothek. Wir müssen die Einstellung des Sitri-Objekts leicht ändern.
- Ändern Sie app / config / provider.py . Wir werden SystemCredentialProvider durch YamlCredentialProvider ersetzen, sodass Autorisierungsdaten für Systeme von Drittanbietern aus der Datei credential.yaml entnommen werden, die wir nicht zu Commits hinzufügen:
from sitri import Sitri from sitri.contrib.yaml import YamlConfigProvider, YamlCredentialProvider configuration = Sitri( config_provider=YamlConfigProvider(yaml_path="./config.yaml"), credential_provider=YamlCredentialProvider(yaml_path="./credential.yaml"), )
PS: Mehr darüber, was hier tatsächlich passiert, ist in der Dokumentation leichter zu lesen. Kurz gesagt, jetzt haben wir nur entschieden, woher wir die Daten für die Konfiguration und Autorisierung beziehen.
- Da wir im Wesentlichen dieselben Anbieter erstellt haben, ist es besser, die Unterstriche in den Schlüsseln des Aufrufs get_credential durch Punkte in database.py zu ersetzen.
DB_NAME = configuration.get_credential("db.name", path_mode=True) DB_HOST = configuration.get_credential("db.host", path_mode=True) DB_PASSWORD = configuration.get_credential("db.user.password", path_mode=True) DB_PORT = configuration.get_credential("db.port", path_mode=True) DB_USER = configuration.get_credential("db.user.name", path_mode=True)
Die Datei config.yaml befand sich also bereits in der Vorlage, aber credential.yaml sollte von Ihnen selbst geschrieben werden. Im wirklichen Leben werden solche Dateien notwendigerweise zu .gitignore hinzugefügt, aber ich werde die Vorlage credential.yaml zum Repository hinzufügen, damit ihre Struktur für jeden verständlich ist, der in das Projekt einsteigt.
Basis credential.yaml :
db: name: furfur_db host: localhost port: 5432 user: password: passwd name: admin
Datenbank
Die nächste Phase unserer Vorbereitung ist die Bereitstellung des DBMS, in diesem Fall PostgreSQL. Der Einfachheit halber werde ich eine stack.yaml- Datei erstellen , in der ich den Start des Postgres-Containers mit den benötigten Daten beschreibe.
version: '3.1' services: db: image: postgres restart: always environment: POSTGRES_PASSWORD: passwd POSTGRES_USER: admin POSTGRES_DB: furfur_db ports: - 5432:5432
Wie bereits erwähnt, enthält die valefor-Vorlage das grundlegende Benutzermodell, das für die Arbeit der JWT (Handler) erforderlich ist. Der letzte Schritt bei der Vorbereitung der Datenbank ist daher die Migration (Erstellen einer Benutzertabelle).
Als Wurzel des Projekts führen wir die folgenden Befehle aus:
export FLASK_APP=furfur.app flask db init flask db migrate flask db upgrade
Alles, mit der Vorbereitung der Datenbank sowie der allgemeinen Grundlage für unser System, sind wir fertig.
Was weiter?
Im nächsten Teil werden wir darüber sprechen, wie ein einfaches Rollensystem und die JWT-Authentifizierung organisiert werden.
Projekt-Repository: https://github.com/Egnod/furfur
Alles, was in diesem Teil angegeben ist: https://github.com/Egnod/furfur/releases/tag/0.0.2