CGI Sessionverwaltung mit SQL...

Du hast eine Idee für ein Projekt?
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?
Zuletzt geändert von jens am Mittwoch 2. November 2005, 09:04, insgesamt 2-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Danke für deine Antwort... Ich werde es dann so machen, wie du es Vorschlägst :)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Warum? Kann SQL nur int()-Werte vergleichen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

Nö, gehen auch Textwerte, aber ich weiß nicht was der Punkt in Verbindung mit dem kleiner als macht. Evtl. gibts da Probleme.
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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
Zuletzt geändert von jens am Dienstag 7. Juni 2005, 14:11, insgesamt 1-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Mein Admin erlaubt (zu Recht) keine solchen Spässe wie offene FTP-Verzeichnisse. Was benutzt du denn als Alternative.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten