====== Tipps zu Python und Webserver mit Python ======
===== Python Web-Frameworks =====
  * [[https://code.tutsplus.com/tutorials/creating-a-web-app-from-scratch-using-python-flask-and-mysql--cms-22972|Python, Flask und mysql Web]]
  * [[https://www3.tuhh.de/itbh/lehre/inf1-sose2019/python/flask/|Python Flask]] - Kurze Einführung von ITBH Sommer Semester 2019
  * [[https://www.digitalocean.com/community/tutorials/how-to-make-a-web-application-using-flask-in-python-3-de| Flask Tutorial]] - How to make a WEB application using Flask in python 3 in Deutsch
  * [[https://www.djangoproject.com|Django]] - Beliebtes Framework WEB-Framework
    * [[https://www.youtube.com/watch?v=boHX307pyQ4|How To Setup Django Applications with Apache and mod_wsgi on Ubuntu]]
    * [[https://studygyaan.com/django/how-to-setup-django-applications-with-apache-and-mod-wsgi-on-ubuntu?utm_content=cmp-true|how-to-setup-django-applications-with-apache-and-mod-wsgi-on-ubuntu]]
  * [[https://www.linuxtuto.com/how-to-install-django-with-apache-on-ubuntu-22-04|Howto Django Apache Ubuntu22-04]]
    * sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pkg-configbis auf pkg-config sollte schon alles installiert sein. Wird benötigt falls pip install mysqlclientnicht durchläuft. Und bei der MariaDB Konfiguration in den settings.py nochfolgendes bei Databases ergänzen:"OPTIONS": {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" ,
        },
\\ Meine [[entwicklung:python:flask:flask_wsgi_notizen#notizen_zu_django_mit_apache_mod_wsgi|Notizen um meine Django]] mit dem Apache Modul "mod-wsgi" zum Laufen zu kriegen.
==== MySql ====
==== Flask ====
  * [[https://flask.palletsprojects.com/en/2.0.x/#user-s-guide| Flask 2.0.x]] - Flask User Guide
  * [[https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https|Running Flask App over HTTPS]]
=== CAN-Data Visualizer ===
====== Python Libs ======
===== NumPy=====
[[https://numpy.org/|NumPy]]
===== pandas =====
  * [[https://pandas.pydata.org/]]
  * [[https://www.python-kurs.eu/pandas.php|Pandas - Tutorial]]
===== matplotlib =====
  * [[https://matplotlib.org/|matplotlib]]
====== Virtual Env ======
===== python env =====
sudo apt-get install python3-venv
mkdir dev/test1                     # Projekt-Ordner anlegen und in diesen wechseln
cd dev/test1
python3 -m venv venv                # die virtuelle Umgebung erzeugen (Ordner)
source venv/bin/activate            # und aktivieren
....
deactivate                          # und wieder verlassen.
und für die Installation von flask, matplotlib, pandas und numpy wurden noch folgendes benötigt:
- sudo apt-get install libjpeg-dev zlib1g-dev    (damit pillow wegen matplotlib installiert werden kann)
  * [[https://docs.python.org/3/library/venv.html|env]]
  * [[https://towardsdatascience.com/virtual-environments-104c62d48c54|virtual-enviroments]]
==== History Installation  ====
 2017  source venv/bin/activate
 2018  pip3 list
 2019  python3 --version                        => Python 3.6.9
 2020  python3 -m pip install numpy    **
 2021  python3 -m pip install matplotlib  **
 2022  python3 -m pip install wheel             => war dies wirklich notwendig? keine Ahnung
 2023  python3 -m pip install matplotlib **
 2024  sudo apt-get install libjpeg-dev zlib1g-dev
 2025  python3 -m pip install matplotlib  **
 2029  python3 -m pip install pandas  **
 2031  python3 -m pip install flask **
 2032  flask --help
** = das sind die eigentliche benötigte Pakete!   Die anderen werden im Fehlerfall benötigt
**Hinweise WSL2 Ubuntu18.04**:
  * kommt die Meldung mit library oder headerfiles  "zlib not found" dann muss noch sudo apt-get install zlib1g-dev installiert werden
  * kommt no library oder Header found for: jpegsudo apt-get install libjpeg-dev installiert werden.
  * und bei:ModuleNotFoundError: No module named 'setuptools_rust'
  * Start in WSL am besten mit:flask run -h 0.0.0.0 Hierfür muss auch die Umgegungsvariable gesetzt sein:** export FLASK_APP=app.py** oder das Python-Skript ausführbar machen und direkt aufrufen und dann die Parameter in __main__ ändern.
dann:
pip install -U pip setuptools
ausführen
um SSL zu aktivieren war folgendes noch notwendig: 2051  python3 -m pip install cryptography
 2052  pip install -U pip setuptools
 2053  python3 -m pip install cryptography
 
damit es dann bei app.run mit dem Kontext: " ssl_context='adhoc'," als SSL läuft.if __name__ == "__main__":
    app.run(port = 8089, host = "0.0.0.0", ssl_context='adhoc', debug = True)
    
 * Running on https://83.219.65.212:8889/
Und hier zum Abschluss noch die Requirements, so das meine Flask App läuft:(venv) andreas@h2859785:~/dev/flask$ cat requirements.txt
cffi==1.15.0
click==8.0.3
cryptography==36.0.0
cycler==0.11.0
dataclasses==0.8
Flask==2.0.2
importlib-metadata==4.8.2
itsdangerous==2.0.1
Jinja2==3.0.3
kiwisolver==1.3.1
MarkupSafe==2.0.1
matplotlib==3.3.4
numpy==1.19.5
pandas==1.1.5
Pillow==8.4.0
pkg_resources==0.0.0
pycparser==2.21
pyparsing==3.0.6
python-dateutil==2.8.2
pytz==2021.3
six==1.16.0
typing_extensions==4.0.1
Werkzeug==2.0.2
zipp==3.6.0
===== conda =====
  * [[https://towardsdatascience.com/a-guide-to-conda-environments-bc6180fc533|conda]]
====== VS-Code Remote Debugging Flask ======
Um eine Flask Applikation zu Debuggen (Remote) sind folgende Schritte erforderlich:
  * Eine SSH Remote Verbindung zum Server einrichten 
    * [[https://code.visualstudio.com/docs/remote/ssh#_getting-started]]
    * [[https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack|VS-Code Remote Extension Pack]] installieren.
    * Die SSH Konfiguration für den Remote Server sollte dann so aussehen:Host mydomain.de
  HostName mydomain.de
  User andreas
  ForwardAgent yes
  IdentityFile C:\Users\Andreas\.ssh\id_rsa
  * Wenn mit einer virtuellen Python Umgebung auf dem Server gearbeitet wird muss man diese in vscode auch einrichten:
    * [[https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment|Python Envinroment einrichten]] 
    * Da ich Pyhton venv verwende, wurde bei mir die settings.json mit folgendem Eintrag erzeugt: (STRG+Shift+P => Select Python Interpreter => Pfad zur virtuelle Python Umgebung angeben){
    "python.pythonPath": "/home/andreas/dev/flask/venv/bin/python"
}oder {
    "python.pythonPath": "/home/pi/dev/flask/venv/bin/python"
}
  * Beim Starten der Debugsitzung wird der lokale Server Port auf den lokalen Port vom Host umgeleitet.(venv) andreas@mydomain.de:~/dev/flask/flaskCanGraph$  cd /home/andreas/dev/flask/flaskCanGraph ; /usr/bin/env /home/andreas/dev/flask/venv/bin/python /home/andreas/.vscode-server/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy/launcher 43491 -- -m flask run --no-debugger --no-reload 
 * Serving Flask app 'app.py' (lazy loading)
 * Environment: development
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
  * vscode Konfigurations Files für Flask Remote Debugging:
    * {{ :public:launch.json |launch.json}}
    * {{ :public:settings.json |settings.json}}
Sonstige Hinweise:
  * Python Plug-in muss installiert sein (die Abfrage kommt automatisch, falls es noch nicht installiert ist wenn einen Python-Datei geöffnet wird.
  * Eventuell noch den Compiler Auswählen mit: CTRL+SHIFT+P => "python: Select interpreter"   => aus dem venv auswählen
  * Beim Starten vom Debuggen kann man auswählen, ob die Vorschau im Editor (vereinfachter Browser) erfolgen soll. Falls dieser gewählt wurde, kann aber nicht HTTPS verwendet werdenif __name__ == "__main__":
    #app.run(port = 8089, host= "0.0.0.0", debug = True, ssl_context='adhoc')
    app.run(port = 8089, host= "0.0.0.0", debug = True)  # nur für vscode Remotedebugging beim integrierten Fenster (einfacher Browser) kann kein SSSL
====== VS-Code Remote Programmieren/Debugging ======
Hier wird nochmal das Einrichten  von vscode für Remote Programmierung / Debugging mit dem Raspi erklärt. (C-Programmierung):
  * Eine SSH Remote Verbindung zum Server einrichten 
    * "connect to Host" auswählen  (links unten in der Statusleiste auf das Verbindungssymbol klicken
    * Im Pop-Up dann "add new SSH-Host" auswählen und folgendes eintragen:\\ "ssh pi@192.168.178.84 -A"
    * dann das bestehende ssh-Config file auswählen
    * => Meldung das der neue host hinzugefügt wurde, bzw neue Datei anlegen.
    * Am besten dann noch edit Config-File auswählen und die Einträge kontrollieren (IdentityFile muss von Hand hinzugefügt werden) IdentityFile C:\Users\Andreas\.ssh\id_rsa damit das SSH-Key Pair Verfahren für den Login verwendet wird. Ansonsten muss man das Passwort von Benutzer "pi" verwenden.\\ Pfad von "config"-File: C:\Users\Andreas\.ssh
    * Ebenso kann die IP in der config-Datei durch einen Klartextnamen ersetzt werden. Hier mal meine config-datei:Host Raspi
  HostName 192.168.178.84
  User pi
  ForwardAgent yes
  IdentityFile C:\Users\Andreas\.ssh\id_rsa
Etwas verwirrend ist, dass der "HostName" die Rechneradresse ist, und Host der "Name"
  * Nun mit "Connect to host" die Verbindung aufbauen dazu in den PopUps "Linux" auswählen und die Passphrase vom SSH-Key eingeben. \\ Der erste Startup dauert etwas länger, da der Raspi erst mal den vscode Server runterladen muss.
====== Flask und Apache ======
Falls auf dem WEB-Server Plesk verwendet wird, kann man diverse Einträge bzgl. der Apache Kofiguration in Plesk vornehmen, oder seine eigene Einträge unter:/var/www/vhosts/system/geier99.de/conf/vhost.conf
/var/www/vhosts/system/geier99.de/conf/vhost_ssl.conf
vornehmen.
Meine [[entwicklung:python:flask:flask_wsgi_notizen|Notizen um meine Flask-App]] (CAN Log-Files Analyzer) dann mit dem Apache Modul "mod-wsgi" zum laufen zu kriegen.
===== Links =====
  * [[https://stackoverflow.com/questions/74736413/how-do-i-properly-configure-a-python-flask-app-to-be-served-by-apache|how-do-i-properly-configure-a-python-flask-app-to-be-served-by-apache]]
  * [[https://www.opensourceforu.com/2023/03/deploying-a-flask-application-via-the-apache-server/|deploying-a-flask-application-via-the-apache-server]]
  * [[https://help.pythonanywhere.com/pages/Flask/]]