Erklärung Programmiercode

Nilson schrieb:
Hausaufgabe hin oder her, pack den Code bitte in [CODE][/CODE] Klammern
Next Level wäre jetzt auch die richtige Sprache für das Syntax Highlighting zu wählen (fürs nächste Mal dann) :):

1656935096600.png
 
  • Gefällt mir
Reaktionen: cruse und Nilson
Code:
@app.route('/benutzer', methods=['GET', 'POST'])
@login_required
def benutzer():
    if request.method == "GET": #Bei GET Request
        Benutzer_id = session['id'] #Session ID ahnand Nutzer identifieziert wird, es ist vorgesehen das Nutzer eingeloggt ist
        cursor = g.con.cursor() #Datenbankabfrage, anhand der Benutzer ID, die mit dem SELECT befehl die Nutzerdaten aus der Tabelle abruft,*
        cursor.execute(         #*die für den Benutzer gespeichert sind
            "SELECT Benutzer_id, Benutzername, Vorname, Nachname, Geburtsdatum , Strasse, HausNr, PLZ, Email, TelefonNr"
            " FROM Person WHERE Benutzer_id = %s",
            (Benutzer_id,))
        row = cursor.fetchone()
        Person = dict(Benutzer_id=row[0], Benutzer=row[1], Vorname=row[2], Nachname=row[3], Geburtsdatum=row[4], #DICT=Einträge welche aus der Datenbank gelesen wurden, werden in ein Dictionary*
                      Strasse=row[5],                                                                            #*mit dem Namen 'Person' übernommen. Einträge sind gespeichert in row.
                      HausNr=row[6], PLZ=row[7], Email=row[8], TelefonNr=row[9]) #Cursor wird geholt, Befehl wird ausgeführt, Eregbnis wird geholt, Daten werden wieder*
                                                                                 #*ins richtige Format gebracht und ausgegeben
        cursor.close()

Du hast teils noch die selben Fehler..
Z4: "Bei Get Request" stimmt halt nachwievor nicht. Das ist eine Verzweigung, und "Bei ... Request" deutet immer noch einen (nicht existenten) Trigger an
Z5: Da wird einer Variablen ein Wert aus einem Array zugewiesen. Da ist überhaupt keine Logik, die irgendwie geeignet wäre, eine Identifikation durchzuführen. Auch irgendwas mit Loginstatus ist in der Zeile abwesend!
Z6: Das ist immer noch keine Datenabfrage! Was macht g.con.cursor() denn wirklich? Schau nach!
Z7: Wie kommst du dadrauf? Eine besseren Kommentar dazu gab es schon -.-
Z11: Hier wird der "Cursor abgeholt", "row" wird initialisiert und mit den Rückgabewerten von cursor.fetchone() gefüllt.
Z12..14: Hier wird kein "Cursor abgeholt"! Es wird überhaupt ersteinmal das Dictionary "Person" definiert[1] und mit Werten AUS row gefüllt.
"Befehl wird ausgeführt", welcher Befehl denn? Keiner deiner Kommentare geht darauf ein, dass irgendwo ein Befehl definiert ist, der überhaupt auszuführen wäre. Zudem bei cursor.fetchone ein Cursor ausgeführt wird und kein (SQL)Befehl. Bitte scharf überlegen, wo der Cursor in deinem Code definiert wird.
Z14..15: "Daten werden wieder ins richtige Format gebracht und ausgegeben"
Du hast keine Ausgabe definiert!
Wenn du "wieder" schreibst, auf was bezieht sich dieses "wieder" denn? Du definierst ja erstmalig überhaupt die Struktur vom Dictionary "Person". Da kann von "wieder" eigentlich keine Rede sein.
Z16: Was macht diese Zeile eigentlich?


[1] Der Fehler zieht sich bei dir durch, dass du unterschlägst wo, wann, wie Variablen/Objekte definiert/erzeugt werden.
 
Zuletzt bearbeitet:
@Piktogramm:
Also mit Verlaub, mit "#Session ID ahnand Nutzer identifieziert wird," kann man unabhängig von der Orthographie durchaus mehr zanfangen als "Zuweisen der Variable Benutzer_id". Oder hast du selbst keine Ahnung, was da passiert? oO

Vor allem ist das der so ziemlich einzig gute Kommentar, den ich da bislang gesehen habe, weil er ausdrückt was der Sinn der Anweisung ist. Auf technische Beschreibungen, was eine Zuweisung ist, können denke ich alle verzichten.

Ich weiß auch nicht, was an "Bei GET Request" so missverständlich bzw "falsch" sein soll... viel schlimmer ist, dass es ein Trivialkommentar ist.
 
@tollertyp
Naja Identifikation: https://en.wikipedia.org/wiki/Identification_(information)
Der Begriff hat in der Informationstheorie eine wichtige Bedeutung und das was in der Zeile stattfindet ist nicht dazu geeignet eine Identifikation vorzunehmen oder gar zu verifizieren. Es ist halt wirklich nur Initialisierung einer Variablen samt Wertzuweisung. An sich ist das fast schon unsinnig, da der Wert der sessionID eh schon in "session['id']" steht.
Was @TE an der Stelle geschrieben hat ist halt grundlegend falsch. Das Aushandeln einer sessionID zwischen Client und Server bzw. darauf aufbauend eine Identifikation der Session (und nicht zwingend von Nutzern) erfolgt halt komplett wo anders.
Ist das Krümelkackerei? Ja! Ist es notwendig? Genauso ja, denn Computer tun genau das, was ihnen der Code vorgibt. Wobei dieser Code eben nicht mehr ist, als eine Initialisieren und füllen einer Variablen mit dem Inhalt aus session['id'].

if request.method == "GET": #Bei GET Request triggert nicht bei einem Request (der Trigger muss vorher definiert sein). Gehen wir mal auf https://www.duden.de/rechtschreibung/bei und sehen uns "bei" als Zuordnung zeitlicher Abläufe an (Beispiel 4..6), da es eine räumliche Zuordnung kaum sein wird. "Bei" kann als zeitliche Zuordnung gelesen/interpretiert werden. Was an der Stelle nicht der Fall ist!
Das "if" ist schlicht ein "Prüfe ob request.method den Wert "GET" hat und führe Code bedingt aus" bzw. "springe bedingt".

Und klar sind das Trivialkommentare. Sowas wurde im 1. Semster bei Programmieren aber auch abgefragt, eben um festzustellen, ob Studenten wirklich verstanden haben, was der Code macht. Habe ich ätzend gefunden, bis ich Code von Anderen lesen "durfte", wo sich eine gewisse, notwendige Pedanterie nicht etabliert hat..
 
Ach jetzt ist session["id"] aus deiner Sicht plötzlich die Session-ID? Nein, es ist die in der Session gespeicherte Benutzer-ID, weshalb sie auch zur Identifikation dient. Was soll er denn mit der Session-ID anfangen? Vor allem wieso sollte die Session-ID mit der Benutzer-ID in der Datenbank übereinstimmen?

Kurz gesagt: Was du schreibst scheint grundlegend falsch zu sein oder ich habe dich womöglich missverstanden.

----------------------
Edit: Einschub
Aber: Der Kommentar ist trotzdem scheiße. Besser "ID des angemeldeten Nutzers aus der Session holen", noch besser eigentlich gar keinen Kommentar und "id" umbenennen im gesamten Projekt.
----------------------

Und was hast du mit einem "Triggert"? "Bei GET Request" heißt einfach: Wenn es ein GET-Request ist. Mehr nichts. Warum Trigger? Da ist nichts von einem Event die Rede. Wobei die Funktion sogar getriggert wird, wenn ein GET-Request passend zu der URL stattfindet... insofern passt das "bei" hier sehr gut.

OT: wobei ich niemals die Nutzer-ID als "id" in die Session speichern würde, sondern eben als "userID" oder sonst was. Weil "id" kann halt zu allem gehören... Aber das der Code Mängel hat, sieht man ja auch an anderen Stellen.
 
Zuletzt bearbeitet:
Genaugenommen sehe ich nicht, wie session['id'] definiert ist. Da es um HTTP Requests geht und mit HTTP oft sessionIDs zum Einsatz kommen[1], gehe ich stark davon aus, dass es sich bei session['id'] um entsprechende IDs geht. Wenn dem nicht so ist, hat der TE Schelte für die Variablenbenennung verdient.

tollertyp schrieb:
Und was hast du mit einem "Triggert"? "Bei GET Request" heißt einfach: Wenn es ein GET-Request ist. Mehr nichts. Warum Trigger? Da ist nichts von einem Event die Rede. Wobei die Funktion sogar getriggert wird, wenn ein GET-Request passend zu der URL stattfindet... insofern passt das "bei" hier sehr gut.
Richtig, da ist KEIN Event/Trigger definiert. Die Definition davon steht irgendwo anders. Das ist genau die Differenz, die ich herausgearbeitet wissen will. Die Bedingung wird NICHT durch einen Request ausgelöst, die Bedingung prüft NICHT ob es ein Reuest war, es wird geprüft ob (ein vorher festgestellter) Request den Typ/die Methode "GET" hatte und daraufhin wird verzweigt.

[1] Klarstellung, HTTP selbst kennt keine session IDs, dass im Rahmen einer Anwendung SessionIDs über HTTP nutzt ist aber Usus.
 
Piktogramm schrieb:
Genaugenommen sehe ich nicht, wie session['id'] definiert ist.
Genaugenommen hast du dich gar nicht dafür interessiert, es war dir scheiß egal und du bist nicht in der Lage das ganze im Kontext zu sehen. Die Mühe könnte man sich ja machen, wenn man versucht, ein Programm zu verstehen. Aber scheinbar ist es dir wichtiger zu sagen, was eine einzelne Anweisung technisch macht. Mit Gesamtverständnis hat das am Ende dann halt nichts zu tun.

Wenn das das ist, was gewünscht ist: Fein.
Damt ist niemandem geholfen und nicht mal die Fähigkeiten desjenigen, der die Kommentare schreibt, können damit aussagekräftigt bewertet werden.

Wenn jemand aus dem Schnipsel nicht mal rauslesen kann, dass es sich bei session["id"] um die ID des angmeldeten Nutzers handelt, dann ist das schon mal etwas, was ich mir notieren würde, wenn ich den Kandidaten bewerten müsste.
 
@tollertyp
Wenn kein Verständnis dafür da ist, was die Anweisungen auf atomarer Ebene genau bedeuten, kann es kein Verständnis von jenem System geben, welches alle (Teil-)Anweisungen zusammen ausmachen. Wenn eine einzelne Zeile mit "Session ID ahnand Nutzer identifieziert wird, [...]" kommentiert wird, dann ist das für diese Zeile falsch und auch für die gesamte Methodendefinition, in der diese Zeile vorkommt.
Wenn man hingegen die Zeile mit ihrer eigentlichen Funktion beschreibt, könnte man feststellen, dass für die Methode selbst diese Zeile reichlich unnütz ist. Die Zeile könnte mit minimalem Umschreiben des Ganzen komplett weg, die Funktion der Methode bleibe identisch, der Code wäre mMn besser. Naja und eine bessere Benennung von Variablen wäre auch hilfreich :)

Und ja, ich kann Code in keinem Kontext sehen, wenn der (hoffentlich klar definierte Konext) nicht geliefert wird. Ich treffe wie du auch einige, wenn auch andere Annahmen. Meine Annahmen sind für @TE halt ungünstiger, da ich grundlegende Fehler annehme, die ich schon sehr häufig gesehen habe.

Edit: Wobei im Rahmen irgendwelcher Sessions userIDs zu verwenden eigentlich eine ähnlich unschmeichelhafte Annahme für den TE ist.
 
Zuletzt bearbeitet:
Also um zu erkennen, was sesssion["id"] ist genug Kontext da.

Und Tipp: session["group"] würde auch nicht zwingend bedeuten, in welcher Gruppe die Session ist.
 
@tollertyp du musst mich nicht bewerten, da ich zwar auch mal was coden muss, aber mich in dem Kontext nicht als Programmierer/Entwickler bezeichnen würde.
Deshalb frage ich auch einfach grade raus, woran genau erkenne ich denn, das session_id hier nur einen Benutzer_id hält?
Abgefragt wird sie ja aus dem Objekt session und außer der Zuweisung um die ihr euch dreht, sehe ich nicht wo diese Definiert oder verwendet wird. Also ist für mich die Annahme es gibt ein wohl definiertes session Objekt. Aber entweder dieses hat eine vernünftige id, dann ist es falsch diese in eine Benutzer Id zu schreiben. oder die Krux ist schon, dass die Benutzer id genutzt wird um die Session zu identifizieren, was meines Wissens auch nicht grade als Optimal zu bezeichnen ist.
 
  • Gefällt mir
Reaktionen: Piktogramm
Session ist einfach ein Key-Value-Speicher. Es gbt natürlich eine Session-ID, aber die ist nicht Teil dieses Speichers, weil in den Speicher darf man halt legen was man möchte mit beliebigen Keys. Es gibt keine reservierten Keys, falls doch, wäre das ein extrem schlechtes Design. Sonst könnte man ja die Session-ID einfach via session["id"] = "meine neue ID" festlegen... aber mit Session-IDs hat man ja selbst gar nichts zu tun, und da ist auch gut so, dass Session-Objekt (bzw. die Bilbiothek) abstrahiert das ganze.

Und das wohldefinierte Sesssion-Objekt verwendet ein Dictionary, assoziates Array, eine Map, wie auch immer man es nennen will. Ob es selbst ein Dictionary ist, oder ob es intern ein Dictionary hält, keine Ahnug.

Woran du es erkennst:
Code:
 Benutzer_id = session['id']
...
cursor.execute(
            "SELECT Benutzer_id, Benutzername, Vorname, Nachname, Geburtsdatum , Strasse, HausNr, PLZ, Email, TelefonNr"
            " FROM Person WHERE Benutzer_id = %s",
            (Benutzer_id,)) #Sendet Befehl an Datenbank und führt diesen aus

Jetzt kannst du natürlich sagen "Hey, das ist kein Beweis", und das ist richtig. Aber genauso hab ich bislang auch noch nicht gesqehen, was meine Aussage widerlegt, Dürfte ja einfach sein.
 
tollertyp schrieb:
Jetzt kannst du natürlich sagen "Hey, das ist kein Beweis", und das ist richtig. Aber genauso hab ich bislang auch noch nicht gesqehen, was meine Aussage widerlegt, Dürfte ja einfach sein.
Also gehst du davon aus, das im Objekt session ein lausig benannter Key liegt, der die Benutzer_id hält.

In Anbetracht den dutzend anderen Stellen wo Namen hier ohne erkennbares Konzept verwendet werden für mich Nachvollziehbar. Aber wir sind uns ja auch alle einig, das es mit dem Schnipsel erhebliche Unschärfe gibt was genau los ist, und damit auch welche Probleme wirklich schwerwiegend sind.

Gilt ja auch für die Dokumentation durch Kommentare, ich würde wohl dem Schnipsel eine bis zwei Absätze Fließtext voran stellen, und dann im Code nur noch auf Besonderheiten hinweisen, wenn eben Namen hier durch Konvention aus anderen Bereichen übernommen wurden um den Kontext klar zu machen. (z. B. Das die id in Session eben die Benutzer id ist.)
Zeilenweise Code kommentieren musste ich schon zu hauf, und jeder der in den Projekten Ahnung hatte, hat mir zugestimmt, das die Vorgabe sinnlos ist es sei den man will die Zeilenzahl verdoppeln.
 
Keylan schrieb:
Also gehst du davon aus, das im Objekt session ein lausig benannter Key liegt, der die Benutzer_id hält.
Yap, wie ich weiter oben schon geschrieben habe:
tollertyp schrieb:
OT: wobei ich niemals die Nutzer-ID als "id" in die Session speichern würde, sondern eben als "userID" oder sonst was. Weil "id" kann halt zu allem gehören... Aber das der Code Mängel hat, sieht man ja auch an anderen Stellen.

Es gibt halt keinen Grund, warum in der Session die Session-ID gespeichert sein sollte. Das wäre wie den Tresor-Code in den Tresor zu legen.

Es ist viel Unschärfe dabei, sicher, aber das Session-Konzept ist ja nichts neues oder hier exklusives...
 
Zurück
Oben