Seite 1 von 1

Win: CGIHTTPServer zum lokalen CGI-Testen.....

Verfasst: Sonntag 1. August 2004, 22:34
von genrich
Ich arbeite unter Windoof und es wäre einfacher, wenn ich meine CGI-Programme Lokal testen könnte... Nun hab ich aber auch keine große Lust einen echten Server (mit WAMP) aufzusetzten...

Da gibt es doch den CGIHTTPServer aus Python...
Theoretisch sollte es damit gehen:

Code: Alles auswählen

import CGIHTTPServer, BaseHTTPServer
import os

class Handler(CGIHTTPServer.CGIHTTPRequestHandler):
    cgi_directories = ["."]

PORT = 80

httpd = BaseHTTPServer.HTTPServer(("", PORT), Handler)

print "ROOT-Pfad:", os.getcwd()
print "Starte CGI-HTTP-Server auf Port",PORT

httpd.serve_forever()
Allerdings bekomme ich beim Aufruf eines CGI-Programms nur den Download der Datei angeboten :(

Verfasst: Sonntag 1. August 2004, 22:42
von Milan
Wie startest du den Server? "." ist eine relative Angabe und davon hängt es ab, aus welchem Arbeitsverzeichniss der Server gestartet wird. Ich habe da einen absoluten Pfad angegeben, da er ja eh nur lokal bei mir läuft und es keine Missverständnisse geben kann...

Verfasst: Sonntag 1. August 2004, 22:49
von genrich
Ich hab auch mal mir os.chdir() in's richtige Verzeichnis gewechselt und auch die cgi_directories = [] mit einem absoluten Pfad (der selbe wie os.dir()) angegeben, aber das Ergebnis ist das gleiche: CGI-Dateien kann man nur Downloaden....

die Ausgabe des "Servers":

Code: Alles auswählen

localhost - - [01/Aug/2004 23:54:04] "GET /CookieTest.cgi HTTP/1.1" 200 -

Verfasst: Sonntag 1. August 2004, 22:52
von Dookie
Nenn dein Script mal "CookieTest.py" - nur so ne Idee.


Gruß

Dookie

Verfasst: Sonntag 1. August 2004, 22:55
von genrich
Dann sehe ich im Browser den Quellentext... :cry:

Verfasst: Sonntag 1. August 2004, 22:56
von Dookie
sind die Dateirechte auf ausführbar?

Verfasst: Sonntag 1. August 2004, 22:57
von genrich
Meinst du die UNIX Dateirechte unter Windows???

Verfasst: Montag 2. August 2004, 09:21
von Milan
Hi. Ich hab mir mal die Zeit genommen und ein wenig rumgetestet. Scheinbar ist die Implementierung nicht die beste, das Serverroot Verzeichniss darf nicht für CGI-Scripte genutzt werden, die müssen in ein Unterverzeichniss. Außerdem muss nicht der Pfad auf der Platte angegeben werden, sondern der Pfad im Serverbetrieb, dabei fährt man mit absoluten Angaben ganz gut (ich hab also oben was falsches gesagt gehabt... :oops: ). Du könntest also folgendes umsetzen:

Code: Alles auswählen

class Handler(CGIHTTPServer.CGIHTTPRequestHandler): 
    cgi_directories = ["/mydir"]
und schon sind alle Scripte in http://localhost/mydir als CGI erkannt. CGI Scripte aus Python würde ich auch als .py bestehen lassen, da alle anderen Endungen so gehandhabt werden, dass die standartmäßige Verknüpfung der Betriebssystemes genommen wird. Du müsstest also sonst .cgi per hand mit Python verknüpfen, oder mit was du willst.

hth Milan

ps: wo wir gerade bei Servern sind: weiß denn niemnad Rat in meiner Frage "socket.recv" ?

Verfasst: Montag 2. August 2004, 10:21
von genrich
@Milan: Besten Dank!!!! Mit jetzt klappt es auch!

Allerdings hast du recht *.cgi werden so erstmal mit der "Betribssystem-Verknüpfung" ausgeführt...
Nun gibt es ja "Python\Lib\CGIHTTPServer.py" welches ich ja auch benutzte... Wenn man sich das Skript anschaut, ist es garnicht so umfangreich, aufgefallen ist mir gleich def is_python(self, path):

Ich hab es abgeändert, damit *.cgi auch normal mit Python Ausgeführt wird:

Code: Alles auswählen

import CGIHTTPServer
import BaseHTTPServer
import os

CGIPfad="/mydir"

class MyHandler(CGIHTTPServer.CGIHTTPRequestHandler):
    cgi_directories = [CGIPfad]

    def is_python(self, path):
        """Test whether argument path is a Python script."""
        head, tail = os.path.splitext(path)
        return tail.lower() in (".py", ".pyw", ".cgi")

PORT = 80

httpd = BaseHTTPServer.HTTPServer(("", PORT), MyHandler)

print "ROOT-Pfad:", os.getcwd()

print "CGI-Skripte in:",os.getcwd()+CGIPfad
print "Starte CGI-HTTP-Server auf Port",PORT

httpd.serve_forever()
Was ich jetzt noch doof finde... Man kann das CGI-Verz nicht mit dem Browser "Auflisten" lassen... Also man bekommt keine Dateiauflistung des Verzeichnisses zurück... Aber das läßt sich noch verschmerzen...

Verfasst: Montag 2. August 2004, 10:33
von Milan
Hi. Das ist aber auch ein Standart zur Sicherheit, der auch sonst überall ist. Wenns dich stört, es lässt sich verhindern, indem du die Methode is_cgi neu definierst:

Code: Alles auswählen

    def is_cgi(self):

        path = self.path

        for x in self.cgi_directories:
            i = len(x)
            if path[:i] == x and (path[i+1:] and path[i] == '/'):
                self.cgi_info = path[:i], path[i+1:]
                return True
        return False
Ab jetzt zählt der Pfad erst als CGI, wenn mehr als nur das Verzeichniss verlangt wird.

Verfasst: Montag 2. August 2004, 10:40
von genrich
Super! :lol:

Das geht auch... Somit kann ich jetzt schneller meine Python CGI-Progrämmchen testen ohne es immer erst auf den Server zu schieben!

Verfasst: Sonntag 8. August 2004, 14:08
von genrich
Ich hab das Gefühl, das es beim Python-Server die CGI-Skripte gecachet werden... Denn mir scheint, das änderungen nicht immer wirksam werden... Im Browser hab ich den Cache schon ausgeschaltet...

Ich weiß es aber nicht genau... Kennt sich da jemand aus?

Verfasst: Sonntag 8. August 2004, 14:17
von Milan
Hi. Ganz sicher? Wenn du Opera benutzt würde ich auf jeden Fall einstellen, dass er Webseiten und den anderen Babbel immer auf Veränderungen prüfen soll. Dann noch mal den Cache löschen und das wars.
Es MUSS am Browser liegen, da ich mir mal den Quelltext der CGI-Handlerclass zum ausführen von CGI-Scripten durchgelesen hab. Oder benutzt du ein anderes OS als Win bzw. Posix (Unix, Lin ...)?

Verfasst: Sonntag 8. August 2004, 14:23
von genrich
Windoof + Firefox...

Also ich hab mal bei jeder Seite die das CGI-Skript erstellt ein time() eingebaut... Die Zeit schreitet auch immer ein Stückchen vorran, aber dennoch hab ich das Gefühl, das es teilweise eine alte Version des Skripts ist...

Ich bau mal eine Versionsnummer ein, die ich per Hand hochzähle... mal sehen...

Veilleicht ist es einfach nur zu warm zum Programmieren :)