Seite 1 von 1

CGI Sessionverwaltung mit SQL...

Verfasst: Dienstag 31. Mai 2005, 06:37
von jens
EDIT: Aktuelle Info's zum CGI-Sessionhandling hier: http://jensdiemer.de/Programmieren/Pyth ... onhandling

Ich habe mein PyLucid-CMS weiterentwickelt. Mittlerweile kann ich die Seiten komplett mit Python-CGI erzeugen lassen (noch nicht online released).

Nun interessiere ich mich für ein Session-Handling. Dabei hatte ich gerade die Idee es mittels SQL zu erledigen.

Ich stelle mir das ungefähr so vor:
  • - Man hinterläßt beim User eine eindeutige ID per Cookie, z.B. mittels md5(time.time()+IP).

    - Diese ID wird zusammen mit einem Zeistempel und Temporäre Userdaten (z.B. Formulardaten o.ä.) in die SQL-DB geschrieben.

    - Vor jedem schreiben, werden alte Einträge (abgelaufene Session) gelöscht.
Was ich noch nicht genau weiß, wie ein Zeitstempel in SQL gehandhabt wird. Aber das finde ich noch raus, damit ich weiß wie eine DELETE ... WHERE... Klausel aussehen muß.

Natürlich bietet lucid in PHP schon eine Art Session-Handling... Ich hab da auch gleich noch eine Frage dazu hier gestellt!!! Wäre nicht schlecht, wenn es quasi kompatibel zueinander ist ;)

Was haltet ihr von der Idee?

Verfasst: Mittwoch 1. Juni 2005, 11:28
von jens
Bin nun dabei die Sache zu realisieren... Nun frage ich mich gerade, ob ich evtl. zur bestimmung der Zeit (ob Session abgelaufen ist) die Datums- und Zeit-Funktionen vom SQL-Server direkt nutzen sollte, oder vielleicht doch einfach time.time() von Python???

Ich möchte allerdings direkt per SQL die abgelaufenen Sessions löschen lassen? Also erscheint mir die erste Variante besser, hab aber nicht viel Ahnung wie ich es machen kann...

Wer kann mit helfen?

Verfasst: Mittwoch 1. Juni 2005, 12:03
von nbkr
Speicher das am besten als Unix timestamp also mit time.time(). Löschen kannst Du dann immer noch mit

DELETE FROM sessions WHERE time < ' + time.time()

Das geht meistens einfacher als sich mit den verschiedenen Datums- und Zeitfunktion der verschiedenen Datenbanken rumzuärgern.

Verfasst: Mittwoch 1. Juni 2005, 13:35
von jens
Danke für deine Antwort... Ich werde es dann so machen, wie du es Vorschlägst :)

Verfasst: Mittwoch 1. Juni 2005, 13:39
von nbkr
Ach ich sehe gerade ich bin auf einen kleinen Unterschied zwischen PHP und Python reingefallen. (Ich steige gerade erst in Python ein).

In PHP liefert time() keine Nachkommastellen, d.h. obige Methode funktioniert mit PHP in Python hat time.time() aber Nachkommastellen und obige Methode würde nicht richtig funktionieren. D.h. man muss die Nachkommastellen bei time.time() noch weglassen damit es klappt.

Verfasst: Mittwoch 1. Juni 2005, 14:31
von jens
Warum? Kann SQL nur int()-Werte vergleichen?

Verfasst: Mittwoch 1. Juni 2005, 14:34
von nbkr
Nö, gehen auch Textwerte, aber ich weiß nicht was der Punkt in Verbindung mit dem kleiner als macht. Evtl. gibts da Probleme.

Verfasst: Mittwoch 1. Juni 2005, 21:37
von BlackJack
nbkr hat geschrieben:Nö, gehen auch Textwerte, aber ich weiß nicht was der Punkt in Verbindung mit dem kleiner als macht. Evtl. gibts da Probleme.
Der Punkt macht das gleiche wie in vielen Programmiersprachen: einen Dezimalpunkt darstellen. SQL kennt nicht nur ganze Zahlen:

Code: Alles auswählen

sqlite> select 4.2;
4.2
sqlite> select 4.2 < 2.3;
0
sqlite> select 4.2 > 2.3;
1

Verfasst: Mittwoch 1. Juni 2005, 22:45
von jens
Ich hab was gefunden:
$sql_tidy = 'DELETE FROM '.$db_prefix.'_news WHERE datum < date_add(current_date, interval -3 day)';
Außerdem gibt ja den SQL-Typ timestamp... Wenn ich in phpMyAdmin dann ein Wert einfüge, kann ich bei "Funktion" z.B. NOW auswählen... Also gibt es schon Mittel und Wege das ganz komplett in SQL zu machen... Aber ob das besser ist?

Verfasst: Mittwoch 1. Juni 2005, 22:51
von rayo
Hi

Ja würde dir dringend empfehlen mit dem sql timestamp zu arbeiten. musst dich dann halt mit ein paar funktionen auseinandersetzen aber es ist einfach mit denen zu arbeiten und falls mal eine andere sprache darauf zugreifen muss geht es genau gleich.

Gruss

Verfasst: Donnerstag 2. Juni 2005, 22:21
von BlackJack
Bei Datenbankfunktionen muss man aber immer daran denken, das die von DB zu DB verschieden sein können. Man legt sich also auf eine DB fest oder muss das SQL umschreiben wenn man eine andere benutzen möchte.

Verfasst: Montag 6. Juni 2005, 22:50
von jens
Habe die Sourcen in Codesnippets http://www.python-forum.de/viewtopic.php?t=3383 verschoben ;)

Das Problem mit den löschen von Cookies besteht allerdings immer noch: http://www.python-forum.de/viewtopic.php?t=3384

Verfasst: Sonntag 24. Juli 2005, 11:23
von Clython
ICh habe eine kleine Frage zu deinem Sessionhandler. Man muss ja bei der Instantierung eine "File-like"-Object als Argument übergeben. Jetzt ergibt sich aber daraus das Probem, dass wenn der Webserver das Script als User "nobody" ausführt, das Script keine Schreibrechte hat (was bei der Anweisung ein File zu öffnen um das Log reinzuschreiben unweigerlich zu einem Fehler führt). Wie hast du das Problem gelöst?

Verfasst: Sonntag 24. Juli 2005, 11:57
von jens
Ich benutzte keine Datei... Wenn du's aber machen willst, mußt du ein Verz. per FTP erstellen und allen schreibrechten geben. Dann kann auch nobody rein schreiben...

Verfasst: Sonntag 24. Juli 2005, 12:18
von Clython
Mein Admin erlaubt (zu Recht) keine solchen Spässe wie offene FTP-Verzeichnisse. Was benutzt du denn als Alternative.

Verfasst: Sonntag 24. Juli 2005, 14:30
von jens
Sorry, ich meinte per FTP-Client ein Verz. erstellen auf deinem WebSpace erstellen. Dann die Rechte setzten. Dann kannst du per CGI eine Datei in diesem Verz. erstellen. Wenn die Datei existiert, kannst du, glaub ich, dem Verz. wieder normale Rechte geben. Die Datei wurde ja dann von nobody erstellt und er kann wieder in diese reinschreiben.