Python-FLASK im Webspace bei manitu

Von | 19. Mai 2024

Einleitung

Ich habe mein veraltetes System für einen internen Teil meiner Webseite in python mit FLASK neu geschrieben. Schön. Aber wie bekomme ich es im Webspace zum laufen auf den im wesentlichen nur FTP-Zugriff besteht.

Einen ersten Anhaltspunkt wie es gehen könnte, fand ich hier:
https://www.youtube.com/watch?v=dCCSGR9CVk8

Aber ich bin echt zu alt um mir die Infos einzeln aus einem Video immer wieder rauszuklauben. Also versuche ich nach dem Video zu handeln und passe es von STRATO auf manitu an.

SSH-Zugang

Für die STRATO Lösung braucht man einen ssh-Zugang, wir müssen etwas mehr manuell machen, aber dafür geht es ohne SSH.

Test-Environment

Da es aber ein wenig auf die Verzeichnisstruktur beim Projekt ankommt, legen wir ein kleines Test-Projekt an. Bei STRATO müssen die CGIs in cgi-bin liegen, bei manitu, können die CGIs in jedem Ordner liegen, nur auf die richtige Permisson kommt es an.

Wir gehen also in unser Entwicklungsverzeichnis (hier tengicki) und legen ein virtuelles Environment für Flask an. Natürlich gehe ich davon aus das python3 installiert ist, auch bin ich unter Linux (Debian) unterwegs, obiges Strato-Video beschreibt es mit PowerShell für Windows.:

:~tengicki$>  python3 -m venv flaskenv

Nun aktivieren wir das Environment und installieren FLASK:

:~tengicki$> cd flaskenv
:~tengicki/flaskenv$> source bin/activate
:~tengicki/flaskenv$> pip3 install flask

Test-Anwendung

Weiter gehts, source Verzeichnis anlegen und eine ganz kleine App schreiben, das HTML legen wir dann gleich in den Ordner templates.

:~tengicki/flaskenv$> cd source
:~tengicki/flaskenv/source$> nano hello.py

from flask import Flask, render_template
app = Flask(name)

@app.route("/")
def hello():
return render_template('hello.html')

:~tengicki/flaskenv/source$> mkdir templates
:~tengicki/flaskenv/source$> nano templates/hello.html

<html>
<head></head>
<body><p>Hello World</p></body>
</html>

Die Anwendung läßt sich nun testen, in dem wir sie in der Testumgebung starten und via localhost:5000 schauen ob sie reagiert:

:~tengicki/flaskenv/source$> flask --app hello run

Dieses Testserver für lokale Entwicklung werden wir in der Produktion natürlich nicht nutzen. Deswegen der CGI-Ansatz.

CGI-Script

Weiterführende Information gibt es hier. Wir wollen jetzt ein CGI File anlegen, welches wir über den WebServer ansteuern, dass dann die flask-App passend startet. Das try-except muss in der Produktion wieder weg, damit die Fehler im Log-File landen. Aber jetzt wollen wir bei der Installation sofort sehen was schief läuft und daher habe ich es eingebaut

:~tengicki/flaskenv/source$> nano hello.cgi

#!/usr/bin/python3
try:
from wsgiref.handlers import CGIHandler
from hello import app
CGIHandler().run(app)
except Exception as err:
print('Content-Type: text/html\n\n')
print(err)

Deployment (1. Versuch)

Wenn man obigen Video folgt muss nur ein passendes python pip-Kommando via ssh ausgeführt werden und damit wird das lokale Environment eingerichtet.

Bei Strato geht das, beim Manitu ist der Server dichter, d.h. pip läßt sich nicht ausführen. Wir müssen die Pakete also manuell hochladen.

Als zweite Idee nehmen wenn dann noch die Erweiterung des Pfades auf unsere neuen hochgeladenen Sourcen aus dem strato Video mit.

Letztendlich machen wir es jetzt manuell.

Deployment (so geht es dann)

Wir legen uns mit der manitu Konfiguration unter “Webseiten” eine Webseite mit Subdomain an, hier “test.tengicki.de” und lassen dies auf ein Verzeichnis zeigen “/web/webflask/source”. Manitu legt nahe, oder verlangt, dass alle Webseiten unter /web/ liegen.

Die Module, die wir verwenden wollen liegen alle auf Grund des oben angelegten Python-Environments in “~/tengicki/flaskenv/lib/python3.9/site-packages/”. Mit einem geeigneten Tools (zum Beispiel FileZilla) laden wir nur lib vollständig mit seinem Unterverzeichnis nach “/web/webflask”.

Damit unserer Python Script diese Verzeichnisse findet, brauchen wir noch ein Skript dependencies.py und wir ergänzen hello.py um dieses Import. Welches Basis-Verzeichnis “/home/sites/…” es bei Euch ist, könnt Ihr in den technischen Daten Eures Webhosting-Pakets nachsehen.

:~tengicki/flaskenv/source$> nano dependencies.py
import sys

sys.path.append('/home/sites/site1000xxxxx/webflask/lib/python3.9/site-packages')

:~tengicki/flaskenv/source$> nano hello.py
import dependencies
from Flask import ...
...

Nun laden wir unsere drei Dateien “hello.py” “hello.cgi” und “dependencies.py” nach “”/web/webflask/source”. Wichtig, alle drei brauchen Ausführungspermission “755”, auch das läßt sich über FileZille setzen.

Nun kann man das ganze aufrufen “https://test.tengicki.de/hello.cgi”.

.htaccess

Wenn die Anwendung komplexer wird und das hello.cgi bzw index.cgi nicht teil der URL sein soll, aber dann eingefügt werden soll, kann man das im lokalen .htaccess-File regeln.

a) Zuerst bei bestehenden Dateien/Pfaden und wenn index.cgi schon drin ist, machen wir nichts:

#for exisiting files
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
# Check if the request is not already for index.cgi
RewriteCond %{REQUEST_URI} ^/index\.cgi
RewriteRule ^.*$ - [NC,L]

b) im gleichen File im zweiten Teil fügt man dann index.cgi ein und läßt pfad und query unangetastet:

# Rewrite the URL to /index.cgi/original_path while preserving the query string
RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]

It is magic, it works.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert