Skip to content

Flask Projekt auf einem anderen Rechner installieren

Python3
1 1 192
  • So als Hobby Entwickler hat man manchmal harte Aufgaben 🙂

    Ich habe eines meiner Flask-Projekte mal auf meinem Testrechner versuchsweise installiert um zu schauen, ob das klappt und wo es überall hakt.

    Repo clonen

    Mein Projekt liegt auf gitlab.com und ist nicht privat. Somit ist der Zugriff nicht trivial. Man benötigt einen Access Token, den man sich folgendermaßen erstellen kann.

    Man klickt auf das Icon und dann auf Preferences. Danach auf Access Tokens. Dort erstellt man sich einen.

    Bevor man das Projekt holt, legt man einen Ordner an und wechselt in dieses Verzeichnis. Dann kann man sich das Projekt holen.

    git clone <Repo-URL>
    

    Danach wird man nach dem Benutzer und dem Token gefragt. Um diese Abfrage in Zukunft zu verhindern, kann man folgenden Git Befehl benutzen.

    git config --global credential.helper store
    

    Ok, nun war das Repo auf meinem Rechner.

    Virtuelle Umgebung

    Um mit Python und seinen ganzen Paketen vernünftig arbeiten zu können, benötigt man eine virtuelle Umgebung. Stellt Euch das bitte wie einen Container vor, ein installiertes Paket liegt nur dort und ist für das Hauptsystem meines Rechners nicht vorhanden. Es gibt mehrere Möglichkeiten das zu verwalten, ich mache das wie folgt. Wir befinden uns in dem geclonten Verzeichnis.

    python3.11 -m venv .venv
    

    Damit wird die virtuelle Umgebung angelegt. Dazu wird automatisch der Ordner .venv erzeugt. Wenn man mal Probleme hat, kann man diesen auch löschen und von vorne beginnen.

    Diese Umgebung muss aktiviert werden.

    source .venv/bin/activate
    

    Auf der Kommandozeile wird das jetzt angezeigt, das man sich in der virtuellen Umgebung befindet. Das ist sehr unterschiedlich von Distribution zu Distribution und auch abhängig davon welche Konsole man benutzt.

    Python Module

    Wenn man jetzt die Anwendung mit

    python app.py
    

    startet, bekommt man eine Fehlermeldung.

    ModulNotFoundError: No module named 'flask'
    

    Ok, da wir uns in einer virtuellen Umgebung befindet, sind dort keinerlei Module installiert. Das heißt, wir müssen das jetzt nachholen. Dazu habe ich auf dem Entwicklungsrechner folgenden Befehl benutzt.

    pip freeze > requirements.txt
    

    Dieser Befehl schaut nach, welche Module installiert sind und erzeugt eine Liste. Ein Auszug

    amqp==5.2.0
    appdirs==1.4.4
    argon2==0.1.10
    argon2-cffi==23.1.0
    argon2-cffi-bindings==21.2.0
    asgiref==3.7.2
    asttokens==2.4.1
    async-timeout==4.0.3
    

    Diese Datei befindet sich jetzt innerhalb des Repositorys. Aufpassen, bei mir war das noch unter 'Unversioned Files' was mir doch ein paar Probleme bereitet hatte.

    Ok, wie installieren wir jetzt die Module? Mit

    pip install -r requirements.txt
    

    werden die dann alle installiert. Danach sollte das Projekt laufen.

    Andere Abhängigkeiten

    Mein Projekt nutzt selbst signierte Zertifikate für den Webbrowser, der die Anwendung anzeigt.

    ###############################################
    # Main loop
    ###############################################
    
    if __name__ == "__main__":
        app.run(debug=True, ssl_context=('cert.pem', 'key.pem'))
    

    Die kann man mit folgendem Befehl eben erzeugen.

    openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
    

    Danach war das auch erledigt. Ein weitere Abhängigkeit war das Redis Datenbank Passwort. Dieses habe ich in einer .env abgelegt. Inhalt

    REDIS_PASSWORD = '<PASSWORD>'
    

    Danach lief die Anwendung. Zu dem Redis Datenbank Problem, was mir dann aufgefallen ist, gibt es einen extra Beitrag.

    Vorsicht

    Das ist so nicht für den produktiven Einsatz gedacht.

    debug=True
    

    Da fehlt noch einiges für, aber das ist hier auch nur ein Entwicklungsrechner.

  • Proxmox 8.3 released

    Proxmox proxmox linux
    2
    0 Stimmen
    2 Beiträge
    269 Aufrufe
    FrankMF
    Ich habe gestern mal eine Neuigkeit ausprobiert, den Import einer Anwendung mittels OVA. Dazu habe ich irgendwo im Netz ein File für OpenProject gefunden (steht schon sehr lange auf meiner Testliste). Der Import war langweilig einfach. Nach Import ein paar Dinge eingestellt, Netzwerk usw. und die VM gestartet. Ok, die Installation war so alt, das ich sie danach wieder gelöscht habe, aber das soll ja kein Problem sein. Man kann OpenProject ja auch mittels .deb Package installieren. Zweiter Test war der "Tag View". Interessantes Feature, was ich auch mal direkt angewendet habe, auch wenn fast alle meine VMs Debian sind
  • Links zu Vaultwarden

    Angeheftet Vaultwarden vaultwarden bitwarden linux
    1
    0 Stimmen
    1 Beiträge
    160 Aufrufe
    Niemand hat geantwortet
  • PHP Webseite lokal einhängen mit sshfs

    PHP php linux
    1
    2
    0 Stimmen
    1 Beiträge
    90 Aufrufe
    Niemand hat geantwortet
  • Python & Redis-Datenbank

    Verschoben Linux python redis
    3
    0 Stimmen
    3 Beiträge
    203 Aufrufe
    FrankMF
    Heute dann die nächste Herausforderung. Mein JSON soll so aussehen, damit ich das entsprechend erweitern kann. Stocks {0: {'stockname': 'Deutsche Telekom Aktie', 'wkn1': '4534543534', 'wkn2': 'sfsdfsdfsfdfd', 'quantity': 100}, 1: {'stockname': 'Henkel', 'wkn1': '4534543534', 'wkn2': 'sfsdfsdfsfdfd', 'quantity': 50}} Die Daten sollen wie oben schon ausprobiert, in einer Redis Datenbank liegen. So weit auch kein großes Problem. ABER, der Zugriff auf diese Daten war dann meine nächste Hürde Ok, ich habe also mehrere Einträge im JSON File bzw. in der Datenbank. Wie komme ich da nun wieder dran. Ein paar später dann die Lösung. Wie komme ich an den einzelnen Eintrag, also über den Index?? r1.json().get('stocks', 1) Gibt als Ergebnis {'stockname': 'Henkel', 'wkn1': '4534543534', 'wkn2': 'sfsdfsdfsfdfd', 'quantity': 50} Ok, das passt schon mal. Somit kann man dann gewohnt auf die einzelnen Elemente zugreifen. print("TESTING", testing['stockname']) Ausgabe TESTING Henkel Ok, Teil 1 erledigt. Jetzt habe ich ja irgendwann mehrere Elemente in der Liste und brauch dann den letzten Index , um damit was machen zu können. Also, z.B. durch die Daten zu loopen. objkeys = r1.json().objkeys('stocks') print("Objkeys", objkeys) Ausgabe Objkeys ['0', '1'] Ok, kommt eine Liste des Index zurück. Damit kann man arbeiten Ich hatte dann zum Testen mittels einer while Schleife die Daten geladen, aber jetzt beim Tippen klingelt es und wir machen das schön mit enumerate @staticmethod def load(): data = {} for count, value in enumerate(objkeys): testing = r1.json().get('stocks', count) data[count] = { "stockname": testing['stockname'], "wkn1": testing['wkn1'], "wkn2": testing['wkn2'], "quantity": testing['quantity']} return data Somit habe ich die Daten aus der Redis Datenbank in einem Objekt und kann damit arbeiten.
  • Nextcloud 23.0.3

    Nextcloud nextcloud linux
    1
    0 Stimmen
    1 Beiträge
    177 Aufrufe
    Niemand hat geantwortet
  • Ubiquiti ER-X - Switch

    Verschoben OpenWRT & Ubiquiti ER-X openwrt linux er-x
    1
    1
    0 Stimmen
    1 Beiträge
    302 Aufrufe
    Niemand hat geantwortet
  • Nach Kernel Update werden die Module nicht automatisch gebaut!?

    Linux linux
    1
    0 Stimmen
    1 Beiträge
    207 Aufrufe
    Niemand hat geantwortet
  • NanoPi R2S - Firewall mit VLan und DHCP-Server

    Verschoben NanoPi R2S nanopir2s linux
    2
    2
    0 Stimmen
    2 Beiträge
    846 Aufrufe
    FrankMF
    Nachdem ich die Tage feststellen musste, das irgendwas mit dem Gerät nicht stimmte, bekam keine DNS Auflösung über die Konsole, habe ich das heute mal eben neuinstalliert. Armbian ist ja immer was spezielles Hat sich bis heute nix dran geändert..... Ok, dann heute mal eben ein neues Image erstellt. Download Gewählt habe ich das Armbian Buster. Image auf die SD-Karte, eingeloggt. Alles wie oben erstellt und abgespeichert. Neustart, geht wieder alles. root@192.168.3.15's password: _ _ _ ____ ____ ____ | \ | | __ _ _ __ ___ _ __ (_) | _ \|___ \/ ___| | \| |/ _` | '_ \ / _ \| '_ \| | | |_) | __) \___ \ | |\ | (_| | | | | (_) | |_) | | | _ < / __/ ___) | |_| \_|\__,_|_| |_|\___/| .__/|_| |_| \_\_____|____/ |_| Welcome to Debian GNU/Linux 10 (buster) with Linux 5.9.11-rockchip64 System load: 2% Up time: 11 min Memory usage: 10% of 978M IP: 192.168.3.15 192.168.1.1 192.168.2.1 CPU temp: 61°C Usage of /: 5% of 29G Last login: Sun Dec 6 12:28:10 2020 from 192.168.3.213 Kernelversion root@nanopi-r2s:~# uname -a Linux nanopi-r2s 5.9.11-rockchip64 #20.11.1 SMP PREEMPT Fri Nov 27 21:59:08 CET 2020 aarch64 GNU/Linux ip a oot@nanopi-r2s:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether b2:b5:10:38:9e:76 brd ff:ff:ff:ff:ff:ff inet 192.168.3.15/24 brd 192.168.3.255 scope global dynamic eth0 valid_lft 6360sec preferred_lft 6360sec inet6 2a02:908:xxxxxx/64 scope global dynamic mngtmpaddr valid_lft 7196sec preferred_lft 596sec inet6 fe80::b0b5:10ff:fe38:9e76/64 scope link valid_lft forever preferred_lft forever 3: lan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b2:b5:10:38:9e:96 brd ff:ff:ff:ff:ff:ff 4: lan0.100@lan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether b2:b5:10:38:9e:96 brd ff:ff:ff:ff:ff:ff inet 192.168.1.1/24 brd 192.168.1.255 scope global lan0.100 valid_lft forever preferred_lft forever inet6 fe80::b0b5:10ff:fe38:9e96/64 scope link valid_lft forever preferred_lft forever 5: lan0.200@lan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether b2:b5:10:38:9e:96 brd ff:ff:ff:ff:ff:ff inet 192.168.2.1/24 brd 192.168.2.255 scope global lan0.200 valid_lft forever preferred_lft forever inet6 fe80::b0b5:10ff:fe38:9e96/64 scope link valid_lft forever preferred_lft forever Vom Notebook aus funktioniert auch alles. So weit bin ich zufrieden. Jetzt mal langsam anfangen, der Kiste IPv6 beizubringen. Oje, nicht gerade mein Lieblingsthema... Bis der NanoPi R4S hier ankommt und ein vernünftiges Image hat, vergeht ja noch was Zeit...