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

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

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 :(
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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...
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

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 -
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Nenn dein Script mal "CookieTest.py" - nur so ne Idee.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Dann sehe ich im Browser den Quellentext... :cry:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

sind die Dateirechte auf ausführbar?
[code]#!/usr/bin/env python
import this[/code]
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Meinst du die UNIX Dateirechte unter Windows???
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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" ?
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

@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...
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

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!
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

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?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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 ...)?
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

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 :)
Antworten