Problem mit pickle auf webserver

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Hallo Forum!

Ich habe ein dringendes Problem und finde einfach keine Lösung!

Mein Projekt: ein Zitatesystem für eine Homepage.

Aber das Problem fängt schon bei den simpelsten Sachen an:

Wieso kann das Script nicht aus der Alle_Zitate.dat lesen?

Code: Alles auswählen

#!/Python26/python.exe
# -*- coding: utf-8 -*-
# -*- coding: iso-8895-15 -*-
print "Content-Type: text/html\n"

import pickle
f = open("Speicher/Alle_Zitate.dat", "r")
alle=pickle.load(f)
f.close()

import htmlentitydefs


print "<html><body><br>"
for zitat in alle:
    print "<pre>"
    print " <? htmlentities('%s'); ?>" % (zitat)
    print "</pre>"
print "</body></html>"
2. Frage: kann das funktionieren? Die Einbettung in php? Oder weiß jemand, wie ich ansonsten die Umlaute ungesetzt bekomme?

Offline funktioniert es!
Auf dem Server habe ich alle Berechtigungen vergeben!
Kann es am Interpreter auf dem Server liegen und wenn, wie installiere ich dann pickle für ihn??

Ich bin ratlos, weil das Problem irgendwie keinen Sinn ergibt!
Und wie heißt eigentlich dieses Modul und die Funktion dafür, dass einem die Fehler auch online angezeigt werden?

Daniel
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Danipol hat geschrieben:Wieso kann das Script nicht aus der Alle_Zitate.dat lesen?
Weil es dafür Datenbanken gibt und weil dein Shebang falsch ist. Du sollst ja den richtigen Shebang setzen und nicht den Shebang erraten.
Danipol hat geschrieben:2. Frage: kann das funktionieren? Die Einbettung in php? Oder weiß jemand, wie ich ansonsten die Umlaute ungesetzt bekomme?
Nein, und ja, indem du sie einfach in die Datei schreibst.
Danipol hat geschrieben:Ich bin ratlos, weil das Problem irgendwie keinen Sinn ergibt!
Und wie heißt eigentlich dieses Modul und die Funktion dafür, dass einem die Fehler auch online angezeigt werden?
``cgitb``. Was du aber eigentlich suchst ist Django.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Ja, mir ist jetzt in den Sinn gekommen, dass ich mich nicht weiter um MySQL drücken kann!
Kannst du mir sagen, wie ich die Installation eines MySql modules hinbekomme?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Uhm... Datenbank. Also optimalerweise nicht MySQL ;)

``aptitude install python-psycopg2`` wäre wohl der einfachste Weg zur Installation eines PostgreSQL-Moduls.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Ich verstehe das alles nicht...

gibt es denn keine einfachere Art? Kann ich kein Dictionary nehmen?

die Tutorials für MySql sind mir alle nicht ersichtlich und dein Link ergibt für mich auch keinen Sinn.

Ich brauche einfach einen Downloadlink und eine Erklärung. Ich weiß, dass klingt jetzt wahrscheinlich nicht so, wie ich es meine.
:oops:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Danipol hat geschrieben:gibt es denn keine einfachere Art? Kann ich kein Dictionary nehmen?
Das Dictionary verschwindet doch nachdem der Request ausgeführt wurde.
Danipol hat geschrieben:die Tutorials für MySql sind mir alle nicht ersichtlich und dein Link ergibt für mich auch keinen Sinn.
Habe ich gesagt, du sollst MySQL nehmen? Ich habe dir doch gar keinen Link geschickt...
Danipol hat geschrieben:Ich brauche einfach einen Downloadlink und eine Erklärung. Ich weiß, dass klingt jetzt wahrscheinlich nicht so, wie ich es meine.
Bittesehr: Downloadlink, Erklärung.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Welchen Sinn haben Zeile 3 und Zeile 4? Weil sich beide nicht in der ersten oder zweiten Zeile befinden, bewirken die gar nichts. Aber angenommen, die erste Zeile war nicht beabsichtigt. Dann bringt die Angabe zum source code encoding immer noch nichts, weil in deinem Quelltext nur ASCII-Zeichen vorkommen.

Siehe auch:
http://www.python.org/dev/peps/pep-0263/
[wiki]Von Umlauten, Unicode und Encodings[/wiki]
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Naja, die Basics sollten wir schon noch verklickern.

Was genau meinst du mit "Umlaute ungesetzt"? Geht es um das Encoding der Quelldaten oder HTML-Entitäten oder worum? Du solltest dein HTML-Dokument zudem mit dem richtigen charset im Content-Type ausliefern und die Daten selbst entsprechend kodieren. Sieht die Ausgabe komisch aus, solltest du im Browser den Quelltext unter die Lupe nehmen und kannst über Ansicht -> Zeichensatz oder ähnliches zwischen gängigen Encodings wie ISO-8859-1(5) alias Latin-1 sowie UTF-8 wechseln und schauen, was das bringt. Wenn ja schickt der Server (bzw. dein Script) womöglich das falsche Encoding im Header.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Danipol,

mir ist unverständlich, warum Leute immer CGI-Anwendungen schreiben wollen, das ist mit das Umständlichste und Primitivste wo geht. Django wäre eine Alternative genau wie eine weitere Reihe von Web-Rahmenwerken, die da sind, um dir die Sache einfacher zu machen.

Beim Thema DB höre auf niemanden außer mir und nimm sqlite. Das ist bei Python eingebaut und sollte für die Aufgabe, eine Liste von Texten zu speichern, absolut ausreichend sein. Ich sehe aber auch nicht, warum pickle nicht gehen sollte - gerade wenn die Daten nun mal in diesem Format vorliegen.

Entscheidend ist aber (mal wieder), den Unterschied zwischen Bytes und Zeichen, sprich `str` und `unicode`, zu verstehen. Ich wundere mich immer wieder, warum das keiner rafft.

Daher: Lass die Coding-Zeilen weg. Die bringen gar nichts. htmlentitydefs brauchst du auch keine. Und HTML-Processing-Instructions helfen dir auch nicht weiter.

Du musst stattdessen wissen, dass HTTP ein auf Bytes basierendes Protokoll ist. Wenn du Zeichen übertragen willst, musst du sie kodieren. Dies nennen man ein Encoding. Eine Seite im text/html-Format wird von einem Browser als ISO-8859-1 kodiert interpretiert, wenn kein anderes Encoding angegeben ist. Für den Header gilt dies immer. Gib aber lieber explizit das Encoding für den Body an und nimm hier UTF-8.

Benutze in deiner Anwendung ausschließlich Zeichen, also Unicode-Strings. Du hast offenbar Python 2.6, also musst du den Datentyp `unicode` und ich `str` benutzen.

Verzichte in einer CGI-Anwendung auf `print`. Denn das kodiert Zeichen bei der Ausgabe wieder zu Bytes, die dann dein Terminal versteht. Unter Windows könnte dies CP1252 sein, muss aber nicht. Du könntest das richtige Encoding es setzen, ist aber aufwendig und alles recht schleierhaft. Mach es explizit! Beachte auch, dass `print` unter Windows aus allen `\n` jeweils `\r\n` macht. Das wäre zwar für HTTP genau richtig, denn dort muss das Zeilenende aus CR und LF bestehen, doch auch hier gilt: Explizit statt implizit. Daher...

Code: Alles auswählen

import sys

def emit(s):
    sys.stdout.write(s.encode("utf-8"))

with open("quotes.dat", "rb") as f:
    quotes = pickle.load(f) # auch dies sollten unicode-Objekte sein, keine str-Objkte!

emit(u"Content-type: text/html;charset=utf-8\r\n\r\n")
emit(u"<html><body><h1>Zitate</h1><ul>")
for quote in quotes:
    emit(u"<li>%s</li>" % quote)
emit(u"</ul></body></html>")
Stefan
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

sma hat geschrieben:mir ist unverständlich, warum Leute immer CGI-Anwendungen schreiben wollen, das ist mit das Umständlichste und Primitivste wo geht.
Es ist auch das Naheliegenste und eine gute Gelegenheit zu lernen, womit man es zu tun hat. Ich denke, jeder Entwickler von Web-Applikationen sollte HTTP verstehen - und CGI-Programmierung ist ein schöner Test, ob das der Fall ist.

Wer dann nach zwei Wochen ein Script mit eingebetteten SQL-Statements und Inline-HTML gefrickelt hat, wird auch die Vorteile von Abstraktion, ORMs, Template Engines und dergleichen verstehen. Mit wachsendem Umfang will man eine vernünftige Applikationsstruktur und nähert ich dem, was Frameworks sind (und kann sich da gute Ideen holen). Wenn man dann noch ein anderes Deployment als CGI verwendet, kommt man sehr schnell mit Threading-Problemen in Kontakt. Das sind alles Dinge, die man wissen oder zumindest mal mitgemacht haben *sollte*. Dann weiß man auch, woran man bei einem Framework ist.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sma hat geschrieben:Beim Thema DB höre auf niemanden außer mir und nimm sqlite. Das ist bei Python eingebaut und sollte für die Aufgabe, eine Liste von Texten zu speichern, absolut ausreichend sein. Ich sehe aber auch nicht, warum pickle nicht gehen sollte - gerade wenn die Daten nun mal in diesem Format vorliegen.
Hätte ich auch gesagt, aber ich will gar nicht wissen wieviele Flatfiles auf Servern liegen deren Berechtigung ``rw-rw-rw-`` (aka ``666``) ist dann rate ich lieber zu etwas anderem.
Y0Gi hat geschrieben:
sma hat geschrieben:mir ist unverständlich, warum Leute immer CGI-Anwendungen schreiben wollen, das ist mit das Umständlichste und Primitivste wo geht.
Es ist auch das Naheliegenste und eine gute Gelegenheit zu lernen, womit man es zu tun hat. Ich denke, jeder Entwickler von Web-Applikationen sollte HTTP verstehen - und CGI-Programmierung ist ein schöner Test, ob das der Fall ist.
Nein, die Masse an plain-PHP-Entwicklern zeigt, dass man auch wenn man sich selbst geißelt keine Ahnung von HTTP, ORMs und Abstraktion haben wird. Autsch, wie viele Leute ihre dynamischen Webseiten haben wollen ohne eine Ahnung davon zu haben wie das Internet überhaupt funktioniert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

PHP und CGI sind zwei verschiedene paar Schuhe. In PHP kann man einfach den Body erzeugen, ohne jemals überhaupt von HTTP oder gar dessen Headern gehört haben zu müssen.


Zurück zum Anfangspost: Wie "dringend" ist es denn? Wenn du eine vernüftige Lösung schaffen willst, kommst du vermutlich nicht drum herum, ein bisschen Zeit zu investieren.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Y0Gi hat geschrieben:Es ist auch das Naheliegenste und eine gute Gelegenheit zu lernen, womit man es zu tun hat. Ich denke, jeder Entwickler von Web-Applikationen sollte HTTP verstehen - und CGI-Programmierung ist ein schöner Test, ob das der Fall ist.
Verständnis ist immer gut. Da kein Widerspruch.

Es ist aber IMHO eine Frage von top-down vs. bottom-up. Während ich früher eher ein Verfechter von bottom-up war und empfohlen hätte, am besten erst mal IP und TCP zu lernen, empfehle ich inzwischen lieber, mit einer möglichst hohen Abstraktion zu beginnen, einfach, weil das Zeit spart und schneller zu ersten Ergebnissen führt, was die Motivation erhält.

Ansonsten sollte jeder Programmierer auch mit Maschinensprache beginnen (und ich meine nicht Assembler - ich konnte mal Z-80-Maschinensprache direkt beim Abtippen aus irgendwelchen Home-Computerzeitschriften lesen, glücklicherweise vergisst man auch wieder solch unnützes Wissen), bevor er sich langsam über C zu bequemeren Sprachen hocharbeiten darf.

Mit dem bottom-up-Ansatz jemandem zum Lernen von Grundlagen zu zwingen funktioniert IMHO nicht. Entweder jemand will lernen, wie HTTP funktioniert (und was die Welt im Inneren zusammen hält) oder eben nicht. Dann stümpert er mittels Trial-und-Error und wahllos aus dem Web zusammengefrickelten Code-Fragmenten so lange herum, bis es anscheinend (und hoffentlich nicht nur scheinbar) funktioniert.
Y0Gi hat geschrieben:Wer dann nach zwei Wochen ein Script mit eingebetteten SQL-Statements und Inline-HTML gefrickelt hat, wird auch die Vorteile von Abstraktion, ORMs, Template Engines und dergleichen verstehen.
Dazu fällt mir ein: "wer aus der Geschichte nicht lernt (oder lernen will), ist verdammt, sie zu wiederholen". Man kann in der Theorie natürlich auch anderen und deren Erfahrung vertrauen. Das gäbe dann einen Geschwindigkeitsvorteil. Ist aber schwer. Kann ich auch nicht ;)

Stefan
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Genau das isses. Jeder hat das Recht, Erfahrungen selbst zu machen :) Allerdings fällt mir persönlich nach dem Studium einiger Libraries eher schwerer, auf anderer Leute Code zu vertrauen ;)

Die Entscheidung muss man letztlich für sich treffen. Ich habe nur oft das Gefühl, dass Lösungen wie CherryPy oder Django Web-Applikationen nicht nur für den Einsteiger vereinfachen, sondern auch verharmlosen. Etwas, das man PHP auch zuschreiben kann, und das Resultat sind u.a. mieser Code und schreiende Sicherheitsprobleme in allen Bereichen.

Einen Kreuzzug für "jeder muss alles können und mal gemacht haben" will ich hier sicher nicht starten, aber das "muss dringend fertig" im Anfangspost vermittelt mir den Eindruck, dass nur genommen, aber nicht investiert werden will. Für eine Realworld-Anwendung ist mir da bei etwas Hingeklatschtem leicht unwohl. Und immerhin hat er sich scheinbar selbst mit CGI auseinandergesetzt, das spricht für den Drang, es zu wollen und sich dabei mit den notwendigerweise auftretenden Problemen auseinander zu setzen.

Letztlich muss in diesem Fall Encoding sowieso verstanden werden. Falls es mit Django zufällig funktionieren sollte, macht es das nicht besser. Mittelfristig ist ein Wechsel auf ein Framework dennoch eine Überlegung wert.
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Aha, das ist hier also zu einer Grundsatzdiskussion gerworden. :D

Naja, ich habe das wegen demZeitdruck schon vor einer Woche gelöst. Nach vielen dummen Tutorials kam auch ein anständiger Forumsbeitrag über MySQL.

Das mit dem Encoding habe ich geregelt.

Ich glaube, dass die meisten Menschen, die einen Computer, Fernseher oder Kühlschrank benutzen, haben auch keine Ahnung von seinem Innenleben.

Im Endeffekt ist doch das erreicht worden was für den Endnutzer am besten ist. Ein System, das simpel in der Anwendung ist, aber Komplex in dem, was es bewirkt.

Also, wenn ich schon mal hier was schreibe, dann habe ich noch ein Problem.

Für die Zitate soll es einen Adminstrationsbereich geben.

Die Tabelle bei MySql beinhaltet:

ID | Vorname | Nachname | Klasse | Zitat | angenommen


jetzt möchte ich, das der admin zitate,die eingetragen wurden entweder akzeptieren oder löschen kann.

Mein Ansatz:

Code: Alles auswählen

<?php

mysql_connect&#40;"ZENSUR"&#41;  or die &#40;"Fehler - Keine Verbindung möglich"&#41;;
mysql_select_db&#40;"humbug"&#41; or die &#40;"Fehler - die Datenbank existiert nicht!"&#41;;

$result = mysql_query&#40;"SELECT * FROM dp_Zitate WHERE angenommen = 0"&#41;;
$row = mysql_fetch_assoc&#40;$result&#41;;

echo '<head><link rel="stylesheet" type="text/css" href="stylesheet.css"></head>';

echo '<form action="Verwalten_auswerten.php" method="POST">';
echo '<font face="Microsoft Sans Serif">';



echo '<div class="hinten">';

while&#40;$row = mysql_fetch_assoc&#40;$result&#41;&#41;
&#123;
     echo ' <br><div class="fenster">';
     echo $row['Vorname']." ".$row['Nachname']." aus der Klasse ".$row['Klasse']." schrieb: <br> ";
     echo '<br><br><div class="Zitat"><pre>'.$row['Zitat']."<br>";
     echo '</pre></div>';
     echo 'NUMMER = ' . $row['ID'];
     echo '</div> <br><hr noshade size="1">';
&#125;

echo 'Eintrag mit der Nummer <input type="Text" name="NUMMER" value="#" size="3"><input type="Submit" name="SUBMIT" value="in die Datenbank übernehmen."></div>';
echo '</font>';
echo '</form>';
 
und das script zum Auswerten:

Code: Alles auswählen

<?php

mysql_connect&#40;"ZENSUR"&#41;  or die &#40;"Fehler - Keine Verbindung möglich"&#41;;
mysql_select_db&#40;"humbug"&#41; or die &#40;"Fehler - die Datenbank existiert nicht!"&#41;;

$aendern = "UPDATE dp_Zitate Set angenommen = '1' WHERE id = '$_POST['NUMMER']' " or die &#40;'falsche NUMMER'&#41;;
echo $aendern;
$update = mysql_query&#40;$aendern&#41; or die&#40;mysql_error&#40;&#41;&#41;;




echo 'übernommen. <br> <a href="#"> zurück </a>';
?>

jetzt möchte ich aber eigentlich, dass es zu jedem Zitat zwei Radiobuttons gibt, bei denen man löschen und übernehmen auswählen kann.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dein Update-Script verarbeitet unter Umständen jedes beliebiges SQL und hat damit eine SQL-Injection-Lücke. Ich würde empfehlen, das auf diese Weise keinesfalls Online zu stellen.

Stefan
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Hinweis: Dies ist ein Python-Forum, kein PHP-Forum. Nicht, dass wir kein PHP könnten, aber darum geht es bei dieser Gratwanderung nicht ;)

Da du jetzt auf Administration anspielst, wird Django umso interessanter. Benutzersystem mit Login und sogar ein Administrationsbereich sind vorhanden. Das hätte man damit durchaus schnell ("dringend") und elegant auf die Beine stellen können. Schneller, lesbarer und sicherer als dieses müßige Stückchen PHP allemal.
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Dann werde ich mir mal Django anschauen.
Einen passwortgeschützte Bereich brauche ich nicht so zu erstellen, habe ich mit Linux auf dem Server eingerichtet.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Der reicht aber nicht mehr aus, sobald du komfortabel zwischen Benutzern unterscheiden willst und die sich auch ausloggen können sollen (Letzteres geht AFAIK bei Basic/Digest Auth nur durch Schließen des Browsers, was für die meisten Ansprüche nicht akzeptabel sein dürfte). Auch Sessions, die das übergangsweise Schließen des Browsers überdauern, lassen sich so nicht realisieren. Die Verwaltung entsprechender Logins per Flatfile ist auch nicht die komfortabelste.
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

in dem Fall reicht es aber perfekt, weil es auch nicht im Design eingeliedert sein soll...
Antworten