2009-03-07 15 views
1

The code.cgi Problem mit Web-Server

#!/usr/bin/env python 

import MySQLdb 

print "Content-Type: text/html" 
print 
print "<html><head><title>Books</title></head>" 
print "<body>" print "<h1>Books</h1>" 
print "<ul>" 

connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db') cursor = connection.cursor() cursor.execute(“SELECT name FROM books ORDER BY pub_date DESC LIMIT 10”) 

for row in cursor.fetchall(): 
    print "<li>%s</li>" % row[0] 

print "</ul>" 
print "</body></html>" 

connection.close() 

Ich speicherte es als test.cgi auf meinen Web-Server. Ich führe es von www.mysite.com/test.cgi vergeblich

Internal Server Error 

The server encountered an internal error or misconfiguration and was unable to complete your request. 

Wie können Sie das Problem lösen?

[Bearbeiten] nach der ersten Antwort

  1. test.cgi ausführbar ist (ich laufe $ chmod + x test.cgi)
  2. ich Apache verwenden.
  3. Ich habe dies in. Bashrc exportieren PATH = $ {Pfad}: ~/bin
  4. Python-Modul MySQLdb ist installiert.
  5. Der Code enthält keine intelligenten Anführungszeichen.

[Bearbeiten] nach der zweiten Antwort

Sie bekommen diesen Fehler, weil Sie haben nicht die MySQLdb Modul installiert , die Python muss eine MySQL-Datenbank sprechen

Ich habe MySQLdb auf meinem System installiert. Das Modul funktioniert, da ich sie importieren kann. Allerdings bekomme ich immer noch den gleichen Fehler, wenn ich ins www. [Mysite] .com/test.cgi gehe.

[Bearbeiten]

Ich bin nicht sicher über die Fragen

Sind die connect() Parameter korrekt? Läuft MySQL unter localhost am Standardport?

Ich laufe MySQL auf meinem Server. Ist die Frage zu den connect() Parametern hier relevant?

Ist die SELECT-Anweisung korrekt?

Sie meinen, ob ich meine SQL-Anweisungen wie SELECT-Anweisung richtig? Ich habe noch keine SQL-Abfragen verwendet. Brauche ich sie hier?

+0

Froh, dass Sie die "intelligente Zitate" behoben. Hier ist eine ausgezeichnete Lektüre zu dem Thema, über das ich gerade gestolpert: http: //blogs.msdn .com/oldnewthing/archive/2009/02/25/9443404.aspx –

+0

@David: Danke für den Link! Wissen Sie, wie Sie überprüfen können, dass die Zeilenenden LF sind? Wikipedia sagt uns, dass LF U + 000A ist. Der Vorschlag von Therms könnte die Lösung für das zweite Problem sein: –

Antwort

2

Eine beliebige Anzahl von Themen, die die Fehler verursachen können Sie sehen:

  1. Ist test.cgi ausführbar (chmod 755) auf dem Server?
  2. Ist das Verzeichnis, in dem Sie test.cgi platziert haben, als ScriptAlias Standort gekennzeichnet oder die Option ExecCGI aktiviert (oder gleichwertig, wenn Sie nicht Apache verwenden)?
  3. Ist python im System PATH oder in der PATH in der Startup-Umgebung des Webservers?
  4. Ist die Python-Bibliothek MySQLdb installiert?
  5. Sind die Parameter connect() korrekt? Läuft MySQL auf dem lokalen Host am Standardport? Ist die SELECT Anweisung korrekt?

Wenn Sie sicher sind, dass python gefunden wird (Test ein möglichst einfaches Skript oder indem Sie sich in den Web-Server, wenn Sie können und die Eingabe which python verwenden), dann können Sie viel besser Debug-Ausgabe erhalten, indem die folgenden das Hinzufügen Anfang des Skripts knapp unter dem shebang:

import cgitb 
cgitb.enable() 

Weitere Details: http://docs.python.org/library/cgitb.html

Außerdem, wenn Sie Shell-Zugriff auf den Webserver haben, versuchen python laufen und einfach eingeben:

>>> import MySQLdb 

Wenn der Befehl ohne Fehler zurückkehrt, haben Sie Ihre Antwort für # 4 oben. Wenn ein Fehler gedruckt wird, müssen Sie MySQLdb in die Python-Installation des Webservers installieren.

BEARBEITEN: Wenn ich genauer auf die Spitze Ihrer Frage schaue, sehe ich, dass der Code am Anfang des Django-Buches aus einem anschaulichen Beispiel herausgekramt wurde. Daher könnte ich # 5 oben um den Vorbehalt erweitern, dass natürlich die erforderliche Datenbank, Tabellen, Benutzer und Berechtigungen in der MySQL-Installation eingerichtet werden müssen, die dem Webserver zur Verfügung steht.

+0

Antworten: 1. Datei ist ausführbar (Ich leite $ chmod + x test.cgi 2. Ich bin mir noch nicht sicher über (2). Ich benutze Apache. 3. Ich habe dies in. Bashrc exportieren PATH = $ {PATH}: ~/bin 4. noch nicht 5. Ich bin mir nicht sicher über die Frage 6. Ich habe noch keine SQL-Befehle ausgeführt Könnten Sie bitte (5) und (6) verdeutlichen: –

+0

@Masi: Wenn MySQLdb nicht installiert ist, dann Python Skript wird in der ersten Zeile fehlschlagen ("import MySQLdb"). Wenn es fehlschlägt, wird es abbrechen und daher keine Daten - auch Header - an Apache zurückgeben. Daher der Fehler, den Sie sehen. –

+0

@Masi: Bitte fügen Sie diese hinzu "cgitb" Zeilen direkt unter dem Shebang - dann werden Sie einige nette Fehler in Ihrem Browser angezeigt bekommen –

2

Ich habe den Code ein wenig aufgeräumt, indem ich bei Bedarf Zeilenumbrüche eingefügt habe und intelligente Anführungszeichen durch " und ' ersetzt habe. Hast du mehr Glück mit den folgenden? Können Sie es von einem Terminal aus starten, indem Sie einfach python test.cgi eingeben?

#!/usr/bin/env python 

import MySQLdb 

print "Content-Type: text/html" 
print 
print "<html><head><title>Books</title></head>" 
print "<body>" 
print "<h1>Books</h1>" 
print "<ul>" 

connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db') 
cursor = connection.cursor() 
cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10") 

for row in cursor.fetchall(): 
    print "<li>%s</li>" % row[0] 

print "</ul>" 
print "</body></html>" 

connection.close() 
+0

Vielen Dank! Ich stelle deine Vorschläge auf die Frage. –

+0

Ich bekomme die folgende Fehlermeldung, wenn ich es im Terminal ausführen: http://dpaste.com/8866/ –

+0

@Masi: wie andere gesagt haben, haben Sie diese Fehlermeldung, weil der Code intelligente Anführungszeichen enthält.Welche Fehlermeldungen (falls vorhanden) erhalten Sie, wenn Sie den Python-Code in meiner Antwort ausführen? –

1

Der Fehler in http://dpaste.com/8866/ tritt auf, weil Sie anstelle von Standard-ASCII-Anführungszeichen "Anführungszeichen" verwenden.

Sie wollen die „und“ mit“ersetzen. Verwenden Sie einfach finden und in Ihrem Texteditor ersetzen.

0

Achten Sie darauf, die Datei mit den richtigen Zeilenenden sind zu speichern. Dh LF nur auf Unix, oder CR/LF für Windows.Ich hatte vor kurzem genau das gleiche Problem ...

+0

Ich benutze Vim. Wie kann ich überprüfen, ob die Zeilenendungen LF sind? Ich finde, dass LF U + 000A ist. (Quelle http://en.wikipedia.org/wiki/Newline) –