sehr seltsames gästebuch!

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Gast

hallo zusammen!

ich habe den code eines gästebuch das man im internet finden erweitert. folgende version bedient sich noch nicht der selbsterstellten module, milan und dookie wissen was ich meine.
jedenfalls tritt das problem bei dieser alten version genauso auf, wie bei der neuen die eben das auslesen der textdatei über ein modul bezieht, dort kann der fehler also nicht liegen. der fehler ist schlicht gesagt seeeeeeeehr seltsam. stellt euch vor in dem gästebuch steht eine menge von z.b. 10 oder 15 (spielt keine rolle) einträge. plötzlich beim abschicken eines weiteren eintrages, wird dieser zwar hinzugefügt aber bis auf die letzten drei (inkl. neuem) verschwindet der rest!

hier der code:

Code: Alles auswählen

#!/usr/local/bin/python

import cgi, urllib, string

puffer=cgi.FieldStorage()
try:
    name=puffer["name"].value
    eintrag=puffer["eintrag"].value
    name=cgi.escape(name,['&','<','>'])
    eintrag=cgi.escape(eintrag,['&','<','>'])
    ergebnis="<p><b>"+name+"</b> schrieb:</p><p>"+eintrag+"</p>"
    pfad='/var/www/web188/html/crossover/'
    dateiname='gaestebuch.txt'
    text=pfad+dateiname
    datei=open(text, 'r')
    inhalt=datei.readline()
    ergebnis=ergebnis+inhalt
    datei.close()
    datei=open(text, 'w')
    datei.write(ergebnis)
    datei.close()
    print "Location: http://www.weberanto.net/crossover/gaestebuch.shtml \n\n"
except:
    print "Location: http://www.weberanto.net/crossover/gaestebuch.shtml \n\n"
was habe ich geändert zum orginal:
1. ich lasse kein html zu
2. ich wollte erreichen, dass die neuen einträge ganz oben stehen.
der einfachste weg schien mir, mal den inhalt zu lesen, ihn dann an das ergebnis des neuen eintrages anzuhängen und dann alles neu reinzuschreiben.

ist da schon irgendwas nicht in ordnung?

ich habe jetzt schon wochenlang immer wieder darüber gehirnt, aber mir fällt da keine sinnvolle erklärung ein.

mfg

rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi rolgal,

hmm als erstes fällt mir auf, daß Du mit inhalt=datei.readline() ja nur eine Zeile der Datei einliest, nicht die ganze datei. Besser wäre hier wohl inhalt=datei.read().
Ansonsten würde ich mal ein paar print statements einfügen um zu sehen welche variablen welche werte bekommen.


Gruß

Dookie
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Das einzige, was mir oben an dem missfällt ist das inhalt=datei.readline(). Wenn durch irgendeinen Zufall mal ein Newline mehr dazukommt ist alles bis auf das neue futsch (ich würde eher schreiben inhalt=datei.read()). Da du aber sagst, der neue Eintrag verschwindet mit, glaub ich nicht das dass der Fehler sein soll, wenn ich auch gerade keinen anderen sehe. Aber probiers mal.

Milan

EDIT: Tja, da hab ich wohl noch ein wenig zu lang gegrübelt... aber wenigstens sind wir uns einig :wink:
Gast

hallo ihr zwei pyhton gurus :D :D


@milan
also das der erste mitverschwindet war ein unsinn von mir! ich habe wollte was anderes sagen.
die letzten drei bleiben, auch der neud.

wie kann ein \n dazukommen und warum verschwindet deshalb alles?

@dookie

also ich habe datei.readline() auf der python shell getestet und sie gibt mir die ganze datei in einem string zurück. will hier nicht auf readline() beharren.

und read() gibt mir in der interaktiven sitzung dassselbe zurück :?:

aber ich tausch es mal aus

danke wieder mal euch beiden

mfg

rolgal
Gast

hm guckt mal was da am ende des strings ist....

wie kommt da ein \r\n hin??? und das aber nur in der shell

Code: Alles auswählen

'<p><b>tester23</b> schrieb:</p><p>test</p><p><b>tester22</b> schrieb:</p><p>test</p><p><b>tester21</b> schrieb:</p><p>test</p><p><b>tester20</b> schrieb:</p><p>test</p><p><b>tester19</b> schrieb:</p><p>test</p><p><b>tester18</b> schrieb:</p><p>test</p><p><b>tester17</b> schrieb:</p><p>test</p><p><b>tester16</b> schrieb:</p><p>test</p><p><b>tester15</b> schrieb:</p><p>tester</p><p><b>tester14</b> schrieb:</p><p>test</p><p><b>tester13</b> schrieb:</p><p>test</p><p><b>tester12</b> schrieb:</p><p>test</p><p><b>tester11</b> schrieb:</p><p>test</p><p><b>tester10</b> schrieb:</p><p>test</p><p><b>tester9</b> schrieb:</p><p>test</p><p><b>tester8</b> schrieb:</p><p>test</p><p><b>testerk</b> schrieb:</p><p>test</p><p><b>testerj</b> schrieb:</p><p>test</p><p><b>testeri</b> schrieb:</p><p>test</p><p><b>testerh</b> schrieb:</p><p>test</p><p><b>testerg</b> schrieb:</p><p>test</p><p><b>testerf</b> schrieb:</p><p>test</p><p><b>testere</b> schrieb:</p><p>\r\n'
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

rolgal hat geschrieben:wie kann ein \n dazukommen und warum verschwindet deshalb alles?
Ganz einfach: Wenn ein Benutzer einen mehrzeiligen eintrag macht, wird der durch cgi.escape nicht umgewandelt, bleibt also bestehen. Um das zu vermeiden müsstest du noch ein eintrag.replace('\n','<br>') durchführen, ist aber nicht nötig.

Wenn nun dieser "\n" einmal in der Datei steht, besteht die Datei nicht mehr nur aus einer Zeile, sondern aus min. 2... readline ließt aber nur die 1. Zeile aus und da wird der neue Beitrag angefügt. Schlussendlich wird dann alles, was in der Datei stand überschrieben (open('...','w')). Die Einträge aus der 1. Zeile sind ja gesichert und werden neu eingetragen, aber der Rest nicht. Mich wunderts deshalb auch, warum du das mit readline gefunden hast. Selbst wenn man "\n" ausschließt, ist das eigentlich nutzlos.

Und ganz am Ende einer Datei steht eigentlich immer ein Newline.

Gruß Milan
Gast

hallo milan!

danke für die super erklärung, das \n am ende störte mich nicht, ich meinte wie eigentlich ein newline mehr dazu kommen kann. aber gut, ist jetzt ja klar.

inzwischen habe ich auch nachgelesen, dass read() auf jeden fall vorzuziehen ist, weil readline() nur bis zum nächsten .......

also wie du gesagt hast.



mfg

rolgal
Antworten