...die Älteren unter uns haben es vielleicht noch erlebt - und natürlich gibt es so etwas heute immer noch - aber so anfang der 90'er hatte man eine gute Chance, dass wenn man ein neues Programm Installiert hat ein anderes nicht mehr funktionierte....
Wer viele Python module verwendet und verschiedene Python Versionen benötigt der kann das auch erleben. Besonders unangenehm: Auch python Module brauchen/benutzen andere Module und es kommt so zu Abhängigkeitsverhältnissen. Das siht man z.B. wenn man ein Modul wie matplotlib mit pip install sieht man unteranderem, was da so alles mit heruntergeladen wird. matplotlib benötigt z.B. auch numpy (auch ein sehr wichtiges Modul) - und so kann es Probleme geben bei der installation - oder wenn ein Modul mit der neusten python version nicht will (wie scheinbar kivy mit python3.12)...
Wer zu höherem Berufen ist löst das mit Anakonda - da macht conda die Arbeit abgeschlossene Arbeitsbereiche einzurichten.
Aber auch mit "Bordmitteln" ist man nicht machtlos. Da ist das Modul venv.
Mit "venv" ist es sehr einfach sich "kleine Arbeitsumgebungen" zu schaffen.
Mit der kurzen Anweisung:
phython -m venv ordner
Also ist man z.B bereits im Ordner "app1" erstellt
python -m venv env
einen Ordner enf mit einigem an Inhalt. Befindet man sich in einem z.B. tieferliegenden Verzeichnis kommt an die Stelle von "Ordner" der Pfad zu den neu zu erstellenden Ordner .. hier "env" genannt..
Man kann auch durch Pfadangabe einer anderen Python -Version (Hier 3.10) verschiedene Schlangen je in einem Käfig halten.
Wichtig: Nach der Erstellung der Umgebung hat der Ordner u.a einen Unterordner Scripts. Im Beispiel unten muss man nun
C:\kivy\app1>env\Scripts activate
Die Arbeitsumgebung aktivieren - ist das gelungen erscheint in der Eingabeaufforderung jeweils ein (env) - oder wie wir den Ordner genannt haben -
(env) C:\kivy\app1>python --version
Python 3.10.3
Kurz noch die Python Version checken und benötigte module installieren...
- Details
- Geschrieben von: admin
- Kategorie: Python
- Zugriffe: 225
Im Grunde ist es nichts neues. Bibliotheken bilden. Ich will jetzt gar nicht näher darauf eingehen, das Programme und "Anwendungen" stets Zwerge sind , die auf den Schultern von Riesen stehen.
Das ist schonmal in mehreren Beziehungen immer Richtig. Auch das eine höhere Sprachen Dateien einbindet, bzw. einen Compiler dazu anweist. Ganz berühmt fängt so'n Programm ja gern mit
Hier folgt eine Aufzählung, von wichtigen Modulen (die nicht unbedingt zum Standard gehören) , die ich recht spät kennengelernt habe oder deren Bedeutung lange unterschätzt habe...
Außerdem Braucht man im Joomla Menü einen Startpunkt für die Module...😬
- Details
- Geschrieben von: admin
- Kategorie: Python
- Zugriffe: 197
..in Ketten oder nicht... irgendwo der Platzhirsch unter den Python Frameworks.
Darf also hier nicht fehlen.
Wir erinnern uns, wie mir die Haare... öhm.. der Bart zu berge stand, als ich mich daran machte mein GPS-Signal Verfolgung als Joomla Erweiterung zu lösen...
Nach vielen Jahren Joomla Pause, war weniger der Einarbeitungsaufwand grundsätzlich mein Problem, sondern Lohnt sich der Aufwand, wenn nächste woche eine Joomla 6 Version alles über den Haufen wirft... mit joomla 1.5 ist es mir Gefühlt damals so ergangen.
Für die Verwaltung von Inhalten - wie diese Seite sie generiert - sicher ein Schönes Werkzeug. Da kommt im 'einfachen' Anwendungsbereich sicher jeder klar. Für viele - die Meisten Anwendungsfälle, gibt es fertige Erweiterungen... da hätte ich echt Problem Geld dafür zu nehmen solch eine Seite aufzusetzen... ..
Handelt es sich aber eher um eine Webanwendung... ich weiß nicht..
Ein wenig krampfig finde ich auf den ersten Blick Django schon. Im Gegensatz von Flask benötigt er - wie Joomla - schon eine Datenbank für sich selbst.
Im Moment leide ich gerade darunter ihm klar zu machen, mir mit seinem Gedönse vom Leib zu bleiben..
In der settings.py des Projekts, vesuche ich mich mit:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
},
'custom_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bahn',
'USER': 'python',
'PASSWORD': '***',
'HOST': 'localhost',
'PORT': '3306',
}
}
Der Plan:
(Nebenbei - schön, dass hier bei Joomla die Codehervorhebung im Admin-Bereich funktioniert aber nicht auf der Darstellungsseite👎)
Bei Django ist soweit alles fein. Django bietet Service - hart an der Grenze, einem alten Mann auf die Nerven zu gehen.... aber nur fast.
Was mir persönlich gegen den Strich geht: das Objekt-Rationale Modell, das zur Verwaltung von Daten standardmäßig verwendet wird.
Nach meiner unmaßgeblichen Meinung hast du entweder einen "leicht handhabbaren objektorientierten Ansatz" oder einen effizienten Datenbank Entwurf.
In den meisten Beispielen hauen die "Profis" eine Klasse über eine Tabelle - und das war es dann. Super, kann ich auch - nur wenn eine Datenbank in Normalform etwas komplizierter wird, werden die Lösungen im Objektansatz mit Python auch immer Kryptischer. Das kann nur so etwas wie eine Sekte (siehe Symbolbild) gut finden oder Masochisten - nur meine Meinung... Leute es gibt SQL - und das ist gut so....
Also mein Ansatz:
Lass Django was des Djangos ist und sein Gedönse in der "default" Datenbank vergraben - und mich in der strikt getrennten Datenbank via
from django.db import connections
...
with connections['custom_db'].cursor() as cursor:
cursor.execute(query, params)
results = cursor.fetchall()
...
Mein Ding machen... Bisher hat er sich aber wenig einsichtig gezeigt. Zum Entwurf wollte ich ihn erst mit MS Sql-Server verbinden - nee keine Chance, großer Widerstand (trotz oder wegen isoliertem "env" module - pyodbc -verheddert). Egal ich hab's fürs Web auch in MariaDB.
Jetzt haben wir den Status: we agree to disagree!
Soll ich jetzt die MariaDB updaten... oder Django ziehen lassen?
- Details
- Geschrieben von: admin
- Kategorie: Python
- Zugriffe: 217
Die Eigentliche Magie passiert in der main.py (oft auch app.py eigentlich egal) ...
Nachdem Flask mit allen Abhängigkeiten installiert ist ist, ist dieses Pythonskript der Ausgangspunkt für den ganzen Zauber...
app = Flask(__name__)
@app.route("/<zusatz>", methods=['GET', 'POST'])
def start_page(zusatz=None):
#Funktion tut irgendwas
# Da tut sich noch mehr
if (__name__ == "__main__"):
app.run(debug=True)
Sobald dann wie üblich die benötigten Module importiert wurden wird mit diesen Zeilen wohl am besten klar was passiert. Man startet den Schlamassel indem man main.py ausführt.
Ab jetzt horcht der Flask auf meinem Laptop am port 5000, wie er hier ja angibt (keine Angst, er ist nicht versessen auf diesen Port, aber wenn man auch den Apachen noch bei sich wohnen hat, ist mir das ganz gelegen, dass er nicht auch auf 8080 oder 80 will...
...im "debug" mode ist er sogar so nett, dass man ihn nicht neu starten muss, wenn man Änderungen an der Datei speichert - und wenn etwas schief geht, wirft er sogar Brauchbare Fehlerseiten raus!
Gut, aber was steht da. ich hab lange überlegt, ob ich mit diesem Ausschnitt beginnen soll - aber es zeigt eine Interessant Möglichkeit, die ich sonst ggf, vergessen hätte.... Die Sache ist nämlich erstmal ganz einfach - jetzt so aus der Hüfte:
Da könnte z.B. stehen :
@app.route('/')
def start():
@app.route('/GPSdaten',methods=['GET'])
def GPSd():
#......
return render_template("seite4.html", titel = t , Einleitung = einleitungstext ,......
@app.route('/hierlang',methods=['POST','GET'])
def sonstwas():
#........
return render_template("seite4.html", daten = tdaten )
@app.route('/hierlang/<variable>',methods=['POST','GET'])
def sonstwer(variable=None):
#......
return render_template("seite5.html", wert = variable)
Man ahnt es Schon: @app.route('/') fühlt sich verantwortlich für die Url http:127.0.0.1:5000 entsprechend http:127.0.0.1:5000/GPSdaten
Bei der Übergabe der Daten vom Skript zum Template durch render_template ist zu beachten:
#bei einer Übergabe via
#könnte
data=42 # String, Numerischer Datentyp , Boolean ...
# oder aber auch ein komplexeres Dictionary, eine Liste oder eine Instanz einer selbst definierten Klasse sein
data = {'name': 'Thomas', 'age': 52, 'status': 'Müde'}
#---- oder
data = ["Peter","Paul","Marie"]
#--oder
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
data = Person('Thomas', 52)
return render_template('seite2.html', daten=data)
Daher auch die kontrollstrukturen im Template.
Auf das Minimum reduziert, also eine wirklich überschaubare Angelegenheit, obwohl Flask natürlich noch viel mehr kann... Aber dieses wenige fühlt sich im Vergleich zu joomla an als wären Tonnen von Mühlsteinen von mir abgefallen...
Zwischenfazit: Für ein Tagebuch wie dieses ist joomla eine gute Wahl..
Der Gedanke eine Anwendung als joomla Erweiterung zu implementieren fällt so allerdings weiter und weiter von mir ab.
z.B. Frage ich mich nun Gerade: Warum funktioniert die Herforhebung in den Python Quelltexten nicht? Welecher "Helper" spuckt mir da wieder in die Suppe? Und die Einrückungen? Zerstört by Joomla & TinyMCE😨
- Details
- Geschrieben von: admin
- Kategorie: Python
- Zugriffe: 532
Wie man sich denken kann, ist Flask nicht das CMS mit "idiotensicherer" GUI daherkommt wie Joomla - im Grunde aber auch recht schnell zu benutzen, wenn es nicht schön sein muss, aber Funktioniere.
Den größten Vorteil sehe ich darin , dass man die Tamplate-Erstellung wirklich Dritten überlassen kann, die vom System überhaupt nichts verstehen müssen. Mach mir eine Statische HTML-Seite mit Javascript-Kosmetik und dir keine Gedanken...
Es ist zwar so, das jinja2 auch so seine Tricks drauf hat etwas Bewegung im Template unterzubringen. So lassen sich Verzweigungen oder Schleifen - bei entsprechender Übergabe auch im Template Platzieren - aber das kennt man von Template-Engines so kennt...
Um nicht zu verwirren hier mal ein Beispiel - wo ich dies zur Anschauung vermieden habe... Die Fachleute können wegschauen - für die, die noch nie so etwas gesehen haben: hinsehen...
Die Ausgabe von einer von Flask erzeugten Seite. Anders wie Joomla spielt Flask hier den Webserver gleich mit und horcht am port:5000 während der Apache hier ebenfalls in meinem Notebook wohnt und weiter am port:80 lauscht. Die Beiden wohnen jetzt quasi Tür an Tür.
Wie kommt diese Bildschöne Seite nun zustande? Ganz grob: Zuerst gab es mal einen Entwurf - gan Statisch in HTML mit geladenen JQuery als Javaskript Bibliothek... danach werden die mit den Pfeilen gekennzeichneten Teile praktisch "ausgeschnitten" - und mit Platzhaltern ersetzt.
Dann sieht das "Tamplate" als HTML-Datei im Browser geöffnet etwa so aus:
Wie man sieht, sieht man nicht viel. Da scheint auch einiges verrutscht, weil ich mich entschlossen habe ganze Blöcke "einfliegen" zu lassen. Die CSS Anweisungen greifen so in's Leere und das Menü landet so neben dem "unsichtbaren" Bild (Der Pfad zum Bild wird auch zur Laufzeit angegeben - wie bei der CSS-Datei s.u ) und nicht darunter....
Würde ich jetzt z.B. das "Menü" (im Grunde ja eine Liste) oder die Tabelle (besteht aus wiederkehrenden Zeilen) durch eine Schleife füllen wollen, sähe das hier gleich viel Professioneller und aufregender mit {% Anweisung %} aus - aber auch unübersichtlicher - besonders wenn man den etwas besonderen Umgang von Python mit Daten nicht wirklich kennt....
Was man in der Ausgabe im Browser nicht sieht - und was ich bei Joomla vermisse:
<link rel="stylesheet" href="https://code.jquery.com/ui/1.14.0/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/{{url_for('static', filename='css/user.css') }}">
Man ist ganz Frei in ein Tamplate einzubinden , was man möchte - hier die CSS Dateien, oder Javaskript Bibliotheken - ohne große Klimmzüge zu machen...Nur der Pad zur CSS-Date (ebenso wie zum Bild) muss dabei "eingeflogen" werden.
Der geneigte Leser mag sich fragen, was in dem Template dieses {{irgendwas | safe}} bedeuten soll. Eigentlich müsste es "unsafe" heißen und bedeutet, dass die Ausgabe die kommt wirklich als HTML ausgegeben werden soll und nicht so, wie hier in der "codebox" dargestellt... Ohne die Anweisung würde es "Html-sicher ausgegeben" und eben nicht ausgeführt.
- Details
- Geschrieben von: admin
- Kategorie: Python
- Zugriffe: 545