Mini Web Framework

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Hi,

ich möchte mal was mit html versuchen, und brauche dazu einen möglichst kleinen WebFramework.

Im endeffekt muss er blos ein paar tabellen brauchbar anzeigen.
Das ganze bevorzugt gleich mit eigenen webserver.



Rein interessehalber würde mich noch interessieren ob es auch sowas wie
einen Framework zum selbstkonfigurieren diverser komponenten auf einer seite gibt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mad-Marty hat geschrieben:Im endeffekt muss er blos ein paar tabellen brauchbar anzeigen. Das ganze bevorzugt gleich mit eigenen webserver.
Hi Mad-Marty!

Jens hat sich mal einen kleinen CGI-Server gebastelt. Der könnte genau richtig für dich sein. Siehe http://www.python-forum.de/viewtopic.php?t=2647

CGI: http://python.org/doc/2.4.2/lib/module-cgi.html
CGITB: http://python.org/doc/2.4.2/lib/module-cgitb.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Mad-Marty!

Ich habe dir ein kleines Beispiel zusammen gestellt. Speichere die beiden Skripte in einem gemeinsamen Ordner und starte das Skript "cgi_server.py".
Danach gibst du in deinem Browser die URL "http://localhost:8081" ein und schon kann es los gehen. (Evt. muss der Port 8081 in der Firewall frei gegeben werden.)

cgi_server.py (von Jens):

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

__version__ = "0.0.7"

__history__ = """
v0.0.7
    - subprocess unnötig, da have_fork, have_popen2 und have_popen3 unnötigerweise
        auf False im RequestHandler gesetzt wurden. Das bedeutetet das die CGI
        Skripte immer mit der Notlösung execfile() ausgeführt wurden.
v0.0.6
    - Überschreiben der CGIHTTPServer.execfile() damit Skripte nicht per
        execfile() sondern per subprocess ausgeführt werden. Damit alle
        "Sub"-Module immer neu geladen werden.
v0.0.5
    - os.environ["QUERY_STRING"] wird richtig übergeben
"""

import CGIHTTPServer, SocketServer
import BaseHTTPServer
import os, sys, socket


class MyRequestHandler( CGIHTTPServer.CGIHTTPRequestHandler ):
    """Modifizieren des Standart RequestHandlers"""

    def is_cgi(self):
        """
        Einfachere Variante, sodas alle Python-Skripte überall ausgeführt werden#
        """
        base, filename = os.path.split( self.path )

        if ".py" in filename:
            if "?" in filename:
                os.environ["SCRIPT_FILENAME"] = filename.split("?",1)[0]
            else:
                os.environ["SCRIPT_FILENAME"] = filename

            os.environ['DOCUMENT_ROOT']     = os.getcwd()
            self.cgi_info = base, filename
            return True

class MyThreadingServer( SocketServer.ThreadingTCPServer ):
    """
    Verbesserung des Standart Servers:
     - ermöglicht das abarbeiten mehrere Anfragen parallel (z.B. Download mehrere Dateien gleichzeitig)
     - Ermöglicht das einschränken des IP-Bereiches aus denen der Server Anfragen behandelt
    """
    allow_reuse_address = 1    # Seems to make sense in testing environment


    def __init__(self, server_address, request_handler, AllowIPs):
        SocketServer.ThreadingTCPServer.__init__(self, server_address, request_handler)
        self.AllowIPs = [mask.split('.') for mask in AllowIPs]

    def server_bind(self):
        """Override server_bind to store the server name. (Parallele Anfragen)"""
        SocketServer.ThreadingTCPServer.server_bind(self)
        host, self.server_port = self.socket.getsockname()[:2]
        self.server_name = socket.getfqdn(host)

    def verify_request(self, dummy, client_address):
        """Checkt ob die IP-Adresse der Anfrage in 'AllowIPs' vorhanden ist"""
        def check_ip(mask):
            for mask_part, ip_part in zip(mask, ip):
                if mask_part != ip_part and mask_part != '*':
                    return False
            return True

        ip = client_address[0].split('.')

        for mask in self.AllowIPs:
            if check_ip(mask):
                return True

        print "IP [%s] not allowed!" % client_address

        return False


def ServerStart( ListenPort, AllowIPs ):
    print "="*80
    print "ROOT-Pfad .......................:", os.getcwd()
    print "Starte CGI-HTTP-Server auf Port .:", ListenPort
    print "Zugelassener IP-Bereich .........:", AllowIPs
    print
    print "Seiten sind nun unter [http://localhost:%s] erreichbar!\n" % ListenPort

    httpd = MyThreadingServer( ("", ListenPort), MyRequestHandler, AllowIPs )

    httpd.serve_forever()


if __name__=="__main__":
    ServerStart(
        ListenPort  = 8081,
        AllowIPs    = ('127.0.0.1', '192.168.*.*')
    )
erster_test.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

print "Content-Type: text/html"
print

import cgi
import cgitb; cgitb.enable()
import time

print \
"""<html>
<head>
  <title>Mein erster CGI-Test</title>
</head>
<body>
  <table border="1" cellspacing="0" cellpadding="3">
"""

data = (
    ("Gerold", "Penz"),
    ("Bernhard", "Winkler"),
    ("Thomas", "Mustermann"),
)
for row in data:
    print "    <tr>"
    for item in row:
        print "      <td>%s</td>" % item
    print "      <td>%s</td>" % time.ctime()
    print "    </tr>"

print \
"""
  </table>
</body>
</html>
"""
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mad-Marty hat geschrieben:Im endeffekt muss er blos ein paar tabellen brauchbar anzeigen.
Das ganze bevorzugt gleich mit eigenen webserver.
Wie wärs mit Colubrid? http://wsgiarea.pocoo.org/colubrid/

Das dürfte so ca. das sein, was du suchst.
TUFKAB – the user formerly known as blackbird
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Danke für die vielen Antworten. :)

Wie ich das sehe kann ich mit Colubrid auch dynamische sachen aus python objekten erzeugen, oder ?
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mad-Marty hat geschrieben:Wie ich das sehe kann ich mit Colubrid auch dynamische sachen aus python objekten erzeugen, oder ?
Unter anderem ja :)
TUFKAB – the user formerly known as blackbird
Antworten