Meine Homepage mit mod_python

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Maralorn
User
Beiträge: 8
Registriert: Montag 5. März 2007, 17:27
Kontaktdaten:

Hallo Leute!

Wie man an meinen wenigen Beitraegen vielleicht schon erkannt hat habe ich mir eine Homepage programmiert. Ich habe ein wenig gezoegert den Quelltext hier vorzustellen aus 2 Gruenden.

1. ist der Quelltext ziemlich lang und ich will euch das nicht zumuten...

2. koennte man den Quelltext vielleicht zum Hacken der Seite verwenden.

Da ihr aber 1. jetzt mit dem lesen aufhoeren koenntet. Und 2. auf meiner Seite nichts zu holen ist, sodass sich Hacken nicht grossartig lohnt habe ich mich entschieden es doch zu tun...
Ich weiss, dass mod_python nicht sehr beliebt ist, ich habe es aber zur Uebung verwendet und weil es nicht mein Server ist.
Es ist mein erstes Python-Projekt geht also schonend mit mir um...

(es laeuft immerhin ihn auf: http://www.maralorn.de/ )

Der Quelltext ist zu lang... deswegen stelle ich ihn auf meinem Server zur Verfuegung.
http://www.maralorn.de/index.py.txt

Ich koennte mir denken, dass jemand das als erstes versucht... aber die *.dat Dateien sind geschuetzt.

Ich hoffe ihr habt es ueberlebt... :lol:

Gruss Malte
BlackJack

Der Quelltext enhält Zeichen ausserhalb des ASCII-Zeichensatzes aber keinen "Kodierungskommentar". Es gibt eine Menge Zeilen die länger als 80 Zeichen sind. Leerzeichen vor und nach Operatoren und nach Kommata wären nett. Leerzeilen zwischen Funktions-/Methodendefinitionen fördern auch die Lesbarkeit.

Kommentare wie ``#der Import`` direkt vor den Importen sind überflüssig. Kommentare die etwas erklären was nicht so offensichtlich ist, wären wichtiger. Was zum Henker macht `conpruef()`? Ebenso sind aussagekräftige Namen wichtig. `pruf`, `ok`, `ol`, `of`, `con` und `bloerb` (Bitte!?) sind das nicht unbedingt. Fast noch schlimmer sind Namen die nicht stimmen wie `letter`, der nicht an einen Brief oder Buchstaben gebunden wird, sondern an eine Liste mit Zeichenketten, wobei die teilweise länger als ein Zeichen sind.

Leerzeichen am Ende einer Zeichenkette entfernt man mit `rstrip()`. Ein Element an eine Liste anhängen geht mit der `append()`-Methode. Mit ``+`` eine Liste anzuhängen, die nur aus einem Element besteht, erzeugt eine neue Liste!

Was in der ``while``-Schleife passiert ist mir echt zu komplex um es ohne Kommentare nachzuvollziehen.

Du benutzt das `pickle`-Modul zu umständlich. In dem Modul gibt es Funktionen zum laden und speichern, es ist also nicht nötig `Pickler` und `UnPickler` selber zu erzeugen. Die Dateien sollten unbedingt im Binärmodus geöffnet werden, sonst sind sie nicht portabel. Und der Name `pickel` regt zum Schmunzeln an. ;-)

Bei Ausnahmebehandlungen sollten immer konkrete Ausnahmen bei ``except`` angegeben werden, sonst wird dort einfach jede Ausnahme behandelt, auch wenn man zum Beispiel einen Namen falsch geschrieben hat. Solche Fehler sind dann schwer zu finden.

Ich lese oft `i['irgenswas']` und `k['irgenswas']` und weiss nicht wo's herkommt und was es bedeutet.

Quelltext und HTML gehört getrennt. Dafür gibt es Template-Systeme.

Code sollte sich nicht wiederholen. Es wird an mehreren Stellen eine Überprüfung gemacht ob der Benutzer etwas darf. Das löst man besser irgendwo zentral, sonst muss man das an mehreren Stellen im Quelltext bearbeiten, wenn man dort etwas ändern möchte. Was immer mit der Gefahr verbunden ist, dass man eine Stelle vergisst oder nicht an allen Stellen exakt die gleichen Änderungen vornimmt. Das führt zu Fehlern, im Fall der Anmeldung vielleicht sogar zu einer Sicherheitslücke.

Warum ist `Inhalt.thrsort()` eine Methode und warum wird dort `Inhalt.save()` aufgerufen? Die "Methode" wird im Skript zum sortieren benutzt, was bedeutet, dass bei *jedem* Vergleich gespeichert wird!? Ausserdem kann man die drei ``if``-Anweisungen durch eine einfachen Aufruf der `cmp()`-Funktion ersetzen.

Falls Titel eindeutig sind, kann man die Schleife in `Inhalt.delete()` abbrechen sobald gelöscht wird. Falls der Titel nicht eindeutig ist, lauert dort ein Problem: Wenn man etwas aus einer Liste entfernt, werden alle folgenden Elemente einen Platz nach vorne kopiert, das verträgt sich nicht mit der Schleife.

Klassennamen werden per Konvention in CamelCase geschrieben und sollten auch aussagekräftig sein. Beides trifft auf `ul` nicht zu. Und warum ist hier plötzlich bei der Definition der Methoden ein Leerzeichen zwischen Methodenname und öffnender Klammer der Argumentliste?

`ul.liste()` ist mal wieder sehr umständlich. Über die Schlüssel zu iterieren um in der Schleife dann auf den Wert zuzugreifen ist viel zu indirekt. Wenn man etwas mit allen Werten machen will, kann man auch direkt über alle Werte iterieren. Letztendlich ist das eine einzelne "list comprehension".

Code: Alles auswählen

    def liste(self):
        return [item['nick'] for item in self.inhalt.itervalues()]
Insgesamt solltest Du Dir bei all diesen ``for``-Schleifen, die etwas in Listen suchen mal überlegen, ob das die richtige Datenstruktur ist, bzw. ob das Dictionary in `ul` den richtigen Index hat. Der Benutzername sollte doch wohl eindeutig sein, warum ist das nicht der Schlüssel des Dictionaries!?

Auf Modulebene sollten nur Klassen, Funktionen und Konstanten stehen, da müsste also noch so einiges in Funktionen verpackt werden.

Für "nichts" gibt es den Typ `None`. So wie's aussieht kann es keinen Benutzer mit dem Namen "nichts" oder das Passwort "nichts" geben. Das ist eine künstliche Einschränkung.

Ansonsten sehe ich noch massive Probleme beim schreiben der Dateien, das nicht gegen konkurrierende Schreib- und Lesezugriffe geschützt ist. Hier ist eigentlich eine Datenbank angesagt.
The Spirit
User
Beiträge: 276
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

hi.
kann weder die homepage erreichen noch das txt file ansehen.
schade
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Maralorn hat geschrieben:Es ist mein erstes Python-Projekt geht also schonend mit mir um...
Hallo Malte!

Ich glaube, das hättest du groß und fett schreiben müssen. :roll:

Jetzt ist es schon zu spät. BlackJack hat sich schon auf dich gestürzt. :wink: Aber mach dir nichts draus. Jeder hat einmal so angefangen. Ich weiß noch wie meine ersten Gehversuche mit Visual Basic aussahen. :twisted:

BlackJack hat die Punkte angesprochen, die du ändern solltest. Das geht zwar nicht von Heute auf Morgen, aber er hat schon recht damit.

mfg
Gerold
:-)

PS: Bist du dir sicher, dass du mit "mod_python" arbeitest? Ich hätte es für reines CGI gehalten, was in meinen Augen sowiso die bessere Wahl ist.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Ups, die Bitte habe ich glatt überlesen. War schon spät, sorry. :-)
Maralorn
User
Beiträge: 8
Registriert: Montag 5. März 2007, 17:27
Kontaktdaten:

BlackJack hat geschrieben:Ups, die Bitte habe ich glatt überlesen. War schon spät, sorry. :-)
Kein Problem das kann ich ab... Danke fuer die ausfuehrliche Kritik. Das ist viel besser als:
Furchtbarer Quelltext! Du solltest ueben...
Ich kann leider nicht alles sofort nachvollziehen, aber das wird schon.
Danke!!!
Ich werde die Seite aber nicht ueberarbeiten da sie schon laeuft... ist mir zu riskant...Vor allem das picklen koennte schiefgehen dann ist der ganze Content weg.

Ich denke aber schon ueber mein naechstes Projekt nach, mit mehr OOP... Ihr werdet dann ja sehen, ob ich mich verbessert habe.
gerold hat geschrieben:Bist du dir sicher, dass du mit "mod_python" arbeitest? Ich hätte es für reines CGI gehalten, was in meinen Augen sowiso die bessere Wahl ist.
Ich glaube auch, dass es reines CGI ist, aber in den Fehlermeldung steht immer etwas von einem mod_python.py Skript... keine Ahnung

Gruss Malte
Antworten