CGIHTTPRequestHandler funktioniert nicht

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Da dies zu TCP/IP gehört habe ich es hier gepostet.

Also, mein Problem ist, dass mein CGIHTTPRequestHandler nicht funktioniert, nämlich Python-seits.
Python gibt aus, dass 'TCPServer' kein Attribut namens 'server_name' hat.

Hier die Fehlermeldung:

Code: Alles auswählen

Exception happened during processing of request from ('127.0.0.1', 41021)
Traceback (most recent call last):
  File "/usr/lib/python3.1/socketserver.py", line 281, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python3.1/socketserver.py", line 307, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python3.1/socketserver.py", line 320, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.1/socketserver.py", line 614, in __init__
    self.handle()
  File "/usr/lib/python3.1/http/server.py", line 352, in handle
    self.handle_one_request()
  File "/usr/lib/python3.1/http/server.py", line 346, in handle_one_request
    method()
  File "/usr/lib/python3.1/http/server.py", line 605, in do_GET
    f = self.send_head()
  File "/usr/lib/python3.1/http/server.py", line 875, in send_head
    return self.run_cgi()
  File "/usr/lib/python3.1/http/server.py", line 964, in run_cgi
    env['SERVER_NAME'] = self.server.server_name
AttributeError: 'TCPServer' object has no attribute 'server_name'

Hier das CGI-Skript(cgi-bin/test.py):

Code: Alles auswählen

import cgi
import cgitb; cgitb.enable()

print("Content-Type: text/html")
print("")

print("<html><head><title>Test</title></head><body><h1>Hello World!</h1></body></html>")
Und hier der Server:

Code: Alles auswählen

import http.server
import socketserver

PORT = 8000
HTTP = ""

handler = http.server.CGIHTTPRequestHandler
httpd = socketserver.TCPServer((HTTP, PORT), handler)

httpd.serve_forever()
Soweit ist alles okay, aber anscheinend hat Python ein Fehler im TCPServer-Modul entdeckt. Vllt. liegt es auch bei dem CGIHTTPRequestHandler.

Empfehlt ihr mir, den nochmal neu zu schreiben, aber dann mit dem BasicHTTPServer?
LG Maik
deets

So geht's bei mir:

Code: Alles auswählen


import http.server
import socketserver

PORT = 8000
HTTP = ""

handler = http.server.CGIHTTPRequestHandler
httpd = socketserver.TCPServer((HTTP, PORT), handler)
httpd.server_name = "test"
httpd.server_port = PORT

httpd.serve_forever()
Ich hab' das aber einfach zurechtgefummelt. Ob das wirklich ein Bug ist oder nicht... kA.
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Achso! Man muss diese Attribute wahrscheinlich setzen, um den Server auszuweisen!

Vielen Dank, ich probiere es gleich aus!

EDIT: Es funktioniert!
LG Maik
deets

daemonTutorials hat geschrieben:Achso! Man muss diese Attribute wahrscheinlich setzen, um den Server auszuweisen!
Glaube ich nicht. Der Port zB ist ja etwas, das inferiert werden koennte - man uebergibt ihn ja. Mindestens der ist IMHO ein Bug. Und bei dem server_namen koennte man auch ein graceful fallback haben, zB zu localhost oder sowas.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Du musst schon den HTTPServer verwenden, dazu ist er da:
http://docs.python.org/py3k/library/http.server.html
Er definiert die Attribute:
http://hg.python.org/cpython/file/defau ... er.py#l126

Code: Alles auswählen

import http.server

PORT = 8000
HTTP = ""

handler = http.server.CGIHTTPRequestHandler
httpd = http.server.HTTPServer((HTTP, PORT), handler)

httpd.serve_forever()
(ungetestet)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

@ms4py: Funktioniert auch. Aber ich bleibe bei meinem TCPServer, ist ja das gleiche, oder?

Jetzt habe ich aber ein anderes Problem:
Ich habe mir PHP5 installiert. Nun will ich wissen, welche Shebang ich setzen muss. Und was ich in der php.ini setzen muss.

Ich habe es mit folgenden versucht:

Code: Alles auswählen

#!/usr/bin/php5
#!/usr/bin/php5-cgi
Bei PHP5 kommt nix raus, bei php-cgi wird etwas in der Konsole ausgegeben.
Hier der ServerCode: http://www.python-forum.de/pastebin.php?mode=view&s=179
LG Maik
lunar

@daemonTutorials: Nein, es ist nicht das gleiche. Wenn Du HTTP verarbeiten möchtest, dann musst Du eben auch die dazu passenden Klassen nutzen.
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

@lunar: Okay, ich schreibe es mal um!
EDIT: Läuft!
LG Maik
Antworten