exceptions.keyerror --> Premature end of script headers:

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ButterflyEffect
User
Beiträge: 11
Registriert: Freitag 17. Oktober 2008, 16:13

Ich versuche mich gerade an einem Webinterface, ein kleines Forumlar...
Doch bekomm ich im Aufruf im Browser folgende Fehlermeldung:
Serverfehler!

Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.

Fehlermeldung:
Premature end of script headers: peoplecgi.py

Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.
Error 500
und wenn ich das Programm mit meinem Debugger laufen lasse bekomme ich diese Meldung:
Traceback (most recent call last):
File "<string>", line 231, in run_nodebug
File "C:\xampp\htdocs\Vanessa\Zat\Step6\WebBasedShelve\cgi-bin\peoplecgi.py", line 80, in <module>
print replyhtml % htmlize(fields)
KeyError: "('name', 'age', 'job', 'pay')"

Code: Alles auswählen

#!C:\Python26\python.exe -u

import cgi, shelve
form = cgi.FieldStorage()
print "Content-type: text/html"
shelvename = 'class-shelve'
fieldnames = ('name', 'age', 'job', 'pay')

replyhtml = """
<html>
<title>People Input Form</title>
<body>
<form method=POST action="peoplecgi.py">
    <table>
        <tr><th><imput type=text name=key value="%(key)s">
        $ROWS$
    </table>
    <p>
    <input type=submit value="Fetch", name=action>
    <input type=submit value="Update", name=action>
</form>
</body>
</html>
"""

rowhtml = '<tr><th>%s<td><input type=text name=%s value="%%(%s)s">\n'
rowshtml = ''
for field in fieldnames:
    rowshtml += (rowhtml % ((fieldnames,) * 3))
replyhtml = replyhtml.replace('$ROWS$', rowshtml)

def htmlize(adict):
    new = adict.copy()
    for field in fieldnames:
        value = new[field]
        new[field] = cgi.escape(repr(value))
    return new

def fetchRecord(db, form):
    try:
        key = form['key'].value
        record = db[key]
        fields = record.__dict__
        fields['key'] = key
    except:
        fields = dict.fromkeys(fieldnames, '?')
        fields['key'] = 'Missing or invalid key!'
    return fields

def updateRecord(db, form):
    if not form.has_key('key'):
        fields = dict.fromkeys(fieldnames, '?')
        fields['key'] = 'Missing Key Input!'
    else:
        key = form['key'].value
        if key in db.keys():
            record = db[key]
        else:
            from person import Person
            record = Person(name='?', age='?')
        for field in fieldnames:
            setattr(record, field, eval(form[field].value))
        db[key] = record
        fields = record.__dict__
        fields['key'] = key
    return fields

db = shelve.open(shelvename)
action = form.has_key('action') and form['action'].value
if action == 'Fetch':
    fields = fetchRecord(db, form)
elif action == 'Update':
    fields = updateRecord(db, form)
else:
    fields = dict.fromkeys(fieldnames, '?')
    fields['key'] = 'Missing or invalid action!'
db.close()
print replyhtml % htmlize(fields)

Danke für die Hilfe[/quote]
BlackJack

Die Fehlermeldung ist doch recht deutlich: es gibt keinen Schlüssel "('name', 'age', 'job', 'pay')". Und wo das nicht klappt wird auch gezeigt. Schau Dir doch mal an, was Du da in `replyhtml` zusammen bastelst.

Code: Alles auswählen

In [24]: fieldnames = ('name', 'age', 'job', 'pay')

In [25]: rowhtml = '<tr><th>%s<td><input type=text name=%s value="%%(%s)s">\n'

In [26]: print rowhtml % ((fieldnames,) * 3)
<tr><th>('name', 'age', 'job', 'pay')<td><input type=text name=('name', 'age', '
job', 'pay') value="%(('name', 'age', 'job', 'pay'))s">
BlackJack

Ein paar weitere Anmerkungen: Du benutzt `eval()` bei einem Wert, den ein Benutzer eingeben kann -- ganz böses Foul! Da kann man Python-Quelltext eintippen! Zum Beispiel ``__import__('os').remove('class-shelve')``.

``except`` sollte man nicht ohne konkrete Ausnahmen verwenden, sonst verdeckt man eventuell Fehler, die dann nur sehr schwer zu finden sind.

Importe sollten am Anfang der Datei stehen, damit man schnell sieht was für Abhängigkeiten ein Modul hat.

Die Zuweisung an `action` in Zeile 69 ist unsauber, weil dort je nach Vorbedingungen sehr unterschiedliche Typen an den Namen gebunden werden.

HTML im Quelltext zusammen basteln ist keine schöne Lösung. Da sollte eine Template-Bibliothek her.

Und für meinen Geschmack ist da zu viel Code der auf Modulebene ausgeführt wird.
ButterflyEffect
User
Beiträge: 11
Registriert: Freitag 17. Oktober 2008, 16:13

Ich habe meinen Fehler doch noch gefunden Line 28/29...falsche variable verwendet -.-'

Code: Alles auswählen

for fieldname in fieldnames:
    rowshtml += (rowhtml % ((fieldname,) * 3))
Und danke für die Tipps :D
Antworten