Seite 1 von 2

mod-python schnuppern

Verfasst: Montag 30. April 2007, 14:09
von Xabyt
Hallo,
ich habe vor einigen Tagen angefangen Python zu lernen und möchte Skripte hauptsächlich für den Gebrauch im Internet erstellen. CGI soll, wie ich gelesen habe, nicht schnell und auch unsicher sein. Deswegen möchte ich mod_python verwenden. Ich habe im Forum bereits gesucht wie die Konfiguration usw. abläuft jedoch nichts gefunden als Aussagen aus denen sich schließen lässt, dass die Programmierung mit mod_python etwas anders abläuft. Was muss ich mit meinen Skripten besonderes anstellen um sie mod_python lauffähig zu machen?

Verfasst: Montag 30. April 2007, 14:23
von rafael
Hoi,

vielleicht hilft dir [wiki]Web-Skripte zum Laufen bringen[/wiki]

mod_python ist nicht gut für den Entwicklungsstatus, wenn du es aber sonst verwendest, kann man es gebrauchen. Ich finde persönlich FastCGI besser.

Verfasst: Montag 30. April 2007, 14:52
von Xabyt
So wie ich das verstanden habe muss man also nur das Modul mod_python aus Apache importieren und jede py-datei wird automatisch als mod_python gestartet?

Verfasst: Montag 30. April 2007, 15:31
von Leonidas
Hallo Xabyt, willkommen im Forum,
Xabyt hat geschrieben:So wie ich das verstanden habe muss man also nur das Modul mod_python aus Apache importieren und jede py-datei wird automatisch als mod_python gestartet?
Nein. mod_python leitet alle Requests an einen Handler (also eine Funktion in einer Datei) weiter, dann kannst du noch mit Publishern und Server pages spielen wenn du magst.
Aber ein Rat: vergiss mod_python. Wenn du es brauchst, weiß du dass du es brauchst, wenn du denkst das du es brauchst ist es höchstwarscheinlich für dich ungeeignet.
Sieh dir besser die vorhandenen Frameworks an oder fange wirklich estmal mit CGI an.

Verfasst: Montag 30. April 2007, 15:33
von gerold
Xabyt hat geschrieben:So wie ich das verstanden habe muss man also nur das Modul mod_python aus Apache importieren und jede py-datei wird automatisch als mod_python gestartet?
Hallo Xabyt!

So einfach ist das auch wieder nicht. Zur Zeit geht die Tendenz dazu, niemandem dazu zu raten, es mit "mod_python" zu versuchen. --> Zu viele Nachteile!

Ich glaube, wenn man genug Zeit dafür hat, dann sollte man sich CGI und auch mod_python mal ansehen, bevor man sich ein Webframework raussucht. http://webpython.codepoint.net/ Aber bei mod_python sollte man dann doch nicht bleiben.

Wenn du schnell etwas Kleines mit einem kleinen Framework auf die Beine stellen willst: --> Karrigell http://karrigell.sourceforge.net/

Ansonsten ist derzeit Django eines der angesagten Frameworks, mit dem man sich evt. noch beschäftigen sollte.

mfg
Gerold
:-)

Verfasst: Montag 30. April 2007, 15:39
von Xabyt
Eine Frage, was benutzt eigentlich Google (die benutzen ja Python), CGI oder mod_python oder etwas anderes? Und nebenbei: Ich habe derzeit (ich bin ja Anfänger) sehr viele Fragen, die mir das Buch das ich zum lernen verwende (OOP mit Python von mitp) nicht beantworten kann. Es sind meistens kleinere Fragen wie z.B. wie man in Python die URL nach einer GET-variable durchsucht, aber ich möchte nicht für sowas kleines einen neuen Thread eröffnen. wie soll ich das handlen?

Verfasst: Montag 30. April 2007, 15:51
von Leonidas
Xabyt hat geschrieben:Eine Frage, was benutzt eigentlich Google (die benutzen ja Python), CGI oder mod_python oder etwas anderes?
Nichts von alledem. Ich tippe mal, dass das Frontend von C-Programmen generiert wird. Python-Sachen laufen bei Google hauptsächlich für geschäftsinterne Sachen (also sowas wie Guido zum Beispiel programmiert, was auch immer das nochmal war).
Xabyt hat geschrieben:Es sind meistens kleinere Fragen wie z.B. wie man in Python die URL nach einer GET-variable durchsucht, aber ich möchte nicht für sowas kleines einen neuen Thread eröffnen. wie soll ich das handlen?
Selbst probieren, Suchfunktion benutzen, Suchmaschine benutzen, einen neuen Thread eröffnen. Diese Reihenfolge scheint mir ganz brauchbar zu sein.

Verfasst: Montag 30. April 2007, 16:06
von gerold
Xabyt hat geschrieben:Eine Frage, was benutzt eigentlich Google (die benutzen ja Python), CGI oder mod_python oder etwas anderes?
[...]
wie man in Python die URL nach einer GET-variable durchsucht,
Hi Xabyt!

Google benutzt Python hauptsächlich zum Prototyping. Wenn alles läuft, dann werden die Programme nach C oder C++ (das weiß ich jetzt nicht mehr genau) umgeschrieben. Bei denen ist die Geschwindigkeit ja **extrem wichtig**. Deshalb machen die das. Python wird bei Google auch für interne Programme eingesetzt. Der Python-Erfinder (Guido van Rossum) arbeitet inzwischen auch bei Google.

Wie du an die mit GET oder POST übermittelten Daten kommst, das ist von der Technik abhängig die du benutzt. Mit CGI kannst du z.B. mit ``cgi.FieldStorage()`` auf die Feldwerte zugreifen. Das wird aber ziemlich genau in der Doku zu CGI erklärt: http://docs.python.org/lib/module-cgi.html

Bei Karrigell gibt es die Variablen ``QUERY`` und ``HEADERS`` usw., die die Werte enthalten. http://karrigell.sourceforge.net/en/programming.htm

mfg
Gerold
:-)

Verfasst: Montag 30. April 2007, 16:11
von Xabyt
Vielen dank, ich probier alles genannte mal aus.

Verfasst: Montag 30. April 2007, 16:46
von gerold
CGI kannst du damit recht schnell ausprobieren:
cgiserver.py:

Code: Alles auswählen

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

from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler

server = HTTPServer(("", 8888), CGIHTTPRequestHandler)

print "Der Server horcht unter http://localhost:8888"
server.serve_forever()
Du musst diesen Server in einen Ordner legen, dessen Pfad keine Leerzeichen oder Sonderzeichen enthält. Sonst funktioniert er nicht. Dann musst du im Ordner noch den Unterordner "cgi-bin" anlegen. In diesen Ordner kommen dann die CGI-Programme.

z.B. so etwas:
cgi_info.py

Code: Alles auswählen

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

print "Content-Type: text/html;charset=iso-8859-1"
print

import cgi
import cgitb; cgitb.enable()

print \
"""<html>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
  <title>CGI-Informationen</title>
</head>
<body>
"""

# Feldwerte
fs = cgi.FieldStorage()
print "<h3>Feldwerte</h3>"
print fs.list
print

cgi.print_arguments()
cgi.print_directory()
cgi.print_environ()
cgi.print_environ_usage()

import os
print os.environ.get("HTTP_HOST")

print \
"""
</body>
</html>
"""
Anzeigen: --> http://localhost:8888/cgi-bin/cgi_info.py

Code: Alles auswählen

C:\cgitest
    |- cgi-bin
    |    |- cgi_info.py
    |
    |- cgiserver.py
mfg
Gerold
:-)

Verfasst: Montag 30. April 2007, 18:32
von Xabyt
Das mit den Getvariablen in Python in der Doku hab ich jedoch nicht gefunden.

Verfasst: Montag 30. April 2007, 22:07
von jens
rafael hat geschrieben:mod_python ist nicht gut für den Entwicklungsstatus
Genau. Mal hier lesen: [wiki]FAQ#IchHabeProblemeMitModPython[/wiki]

@gerold: Mal wieder eine saubere, ausführliche Antwort von dir :shock:
Allerdings hättest du dir das sparen können... *kopfeinzieh* denn schau mal hier: [wiki]CGI[/wiki]:lol:
Allerdings hab ich die Verzeichnisstruktur von dir noch ins Wiki gepackt.

Verfasst: Montag 30. April 2007, 22:40
von gerold
jens hat geschrieben:Allerdings hab ich die Verzeichnisstruktur von dir noch ins Wiki gepackt.
Hi Jens!

Ich habe es noch ein wenig ergänzt.

lg
Gerold
:-)

Verfasst: Montag 30. April 2007, 22:50
von gerold
Xabyt hat geschrieben:Das mit den Getvariablen in Python in der Doku hab ich jedoch nicht gefunden.
Hi Xabyt!

Wenn du im Browser an eine URL den String "?vorname=Gerold&nachname=Penz" anhängst, dann werden diese Daten an das CGI-Skript übermittelt. Diese kannst du dann mit

Code: Alles auswählen

fs = cgi.FieldStorage()
vorname = fs.getvalue("vorname", "")
nachname = fs.getvalue("nachname", "")
abrufen.

Werden diese Daten nicht in der URL, sondern im Header der Anforderung des Browsers übermittelt, dann spricht man von POST. Im Code ändert sich nichts. Du kommst im CGI-Skript mit ``cgi.FieldStorage()`` an die GET- sowie an die POST-Daten.
Im oben aufgezeigten "cgi_info.py" zeige ich die übermittelten Daten mit ``cgi.FieldStorage().list`` an.

Rufe doch noch mal cgi_info.py auf:
http://localhost:8888/cgi-bin/cgi_info. ... hname=Penz
Ganz oben siehst du, dass jetzt ein "vorname" und ein "nachname" übergeben werden.

Ich habe noch ein paar Beispiele in diesem Zip-Archiv herumliegen: http://gerold.bcom.at/python/python_code/cgi_test.zip

mfg
Gerold
:-)

Verfasst: Dienstag 1. Mai 2007, 17:24
von Xabyt
Vielen Dank,
und wie kann ich die gesamte URL abfragen? Also praktisch sowas wie: derzeitigeAdresse = currentURL
print "Du befindest dich auf", derzeitigeAdresse

Wie könnte man sowas hinbekommen? Gibt es da was?

Und nochwas: Wie kann ich (python-)Dateien includen? sowas wie in PHP: include('eineseite.php')?

Gruß,
Felix

Verfasst: Dienstag 1. Mai 2007, 18:38
von mitsuhiko
gerold hat geschrieben:Google benutzt Python hauptsächlich zum Prototyping. Wenn alles läuft, dann werden die Programme nach C oder C++ (das weiß ich jetzt nicht mehr genau) umgeschrieben. Bei denen ist die Geschwindigkeit ja **extrem wichtig**. Deshalb machen die das. Python wird bei Google auch für interne Programme eingesetzt. Der Python-Erfinder (Guido van Rossum) arbeitet inzwischen auch bei Google.
Google Groups, die ganzen Dokumentationsseiten, das interne Bugtracking System sind Python Anwendungen. Das Bugtracking Ding (Name vergessen) läuft auf wsgiref und wie das bei Google Groups aussieht weiß ich nicht.

Verfasst: Dienstag 1. Mai 2007, 22:09
von gerold
Hallo Felix!
Xabyt hat geschrieben:wie kann ich die gesamte URL abfragen?
Pseudo: SERVER_NAME + SERVER_PORT + SCRIPT_NAME + QUERY_STRING
Ich glaube, dass du diese Info evt. vom Apachen bekommst. Das müsste man aber nachprüfen.
Xabyt hat geschrieben:Wie kann ich (python-)Dateien includen? sowas wie in PHP: include('eineseite.php')?
Je nach Anwendung unterschiedlich. Z.B. so:
mywebapp.py:

Code: Alles auswählen

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

from string import Template 


class Session(object):
    # irgendeine Sessionverwaltung...
    pass
SESSION = Session()


def get_header(title = "Hallo Welt"):
    return Template(
        "<html>\n"
        "<head>\n"
        '  <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />\n'
        "  <title>${title}</title>\n"
        "</head>\n"
        "<body>\n"
    ).safe_substitute(locals())
HEADER = get_header()


def get_footer():
    return (
        "\n"
        "</body>\n"
        "</html>\n"
    )
FOOTER = get_footer()
cgitest.py:

Code: Alles auswählen

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

print "Content-Type: text/html;charset=iso-8859-1"
print

import cgi
import cgitb; cgitb.enable()
import mywebapp as app

# Header
print app.HEADER

# Hallo Welt
print "Hallo Welt"

# Footer
print app.FOOTER
mfg
Gerold
:-)

Edit: Ich hatte vergessen eine neuere Version des Codes hier anzuzeigen.

Verfasst: Mittwoch 2. Mai 2007, 12:46
von Xabyt
gerold hat geschrieben: Pseudo: SERVER_NAME + SERVER_PORT + SCRIPT_NAME + QUERY_STRING
Ich glaube, dass du diese Info evt. vom Apachen bekommst. Das müsste man aber nachprüfen.
Das includen sollte ich hinbekommen, aber um meine Frage genauer zu schildern, ich möchte Adressen wie "www.seite.de/?home" hinbekommen, also nicht sowas wie "?seite=home". Das wollte ich so regeln, dass ich die URL abfrage, sie in einer Liste speicher, in einem String alle Listenelement rechts von "?" speichere und so z.B. mit dem erhaltenen String "home" die seite "home" includen kann.


Ich möchte nicht extra ein neues Thema anfangen, deswegen poste ich hier auch folgende Frage: In einem Tutorial wurde beschrieben wie man einen Webkatalogeintragungs"bot" basteln kann, der jedoch anscheinend nur Webkataloge die zur Eintragung CGI-skripte verwenden um einen Beitrag bereichern.

Hier der angegebene Code (von drweb.de):

Code: Alles auswählen

#!/usr/bin/python
import cgi
import urllib
puffer = cgi.FieldStorage ()
url = puffer["url"].value
email = puffer["email"].value
parameter = urllib.urlencode({'url': url, 'email': email, 'action': "Submit"})
urllib.urlopen ("http://www.xy.de/cgi-bin/submit.cgi", parameter)
print "Content-Type: text/plain \n\n"
print "Eintrag erfolgt"
Mein Frag hierzu: Wie kann ich dieses für ein PHP-nutzenden Webkatalog realisieren

Verfasst: Mittwoch 2. Mai 2007, 13:47
von gerold
Xabyt hat geschrieben:
gerold hat geschrieben:Pseudo: SERVER_NAME + SERVER_PORT + SCRIPT_NAME + QUERY_STRING

Code: Alles auswählen

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

# ACHTUNG: text/plain
print "Content-Type: text/plain;charset=iso-8859-1"
print

import cgi
import cgitb; cgitb.enable()
import urllib
import os

server_protocol = os.environ.get("SERVER_PROTOCOL", "http").lower()
if server_protocol.startswith("http"):
    protocol = "http://"
else:
    protocol = ""
server_name = os.environ.get("SERVER_NAME", "")
server_port = os.environ.get("SERVER_PORT", ":80")
if server_port == ":80":
    server_port = ""
else:
    server_port = ":" + server_port
script_name = os.environ.get("SCRIPT_NAME", "")
query_string = os.environ.get("QUERY_STRING", "")
if query_string:
    query_string = "?" + query_string

print "Absolute URL:", urllib.basejoin(
    "%s%s%s" % (protocol, server_name, server_port),
    "%s%s" % (script_name, query_string)
)

Code: Alles auswählen

Absolute URL: http://gpw.gp:8888/cgi-bin/absolute_url.py?vorname=Gerold&nachname=Penz
Das ist jetzt nicht mehr Pseudo-Code. Es ist nicht perfekt, aber es gibt den URL zurück.

mfg
Gerold
:-)

Verfasst: Mittwoch 2. Mai 2007, 13:55
von Xabyt
Puh, ich glaube dann überleg ich mir das mit den "?home" adressen nochmal, oder gibt es da eine andere möglichkeit, also dass ich dieses "?home" anhängsel auslesen kann, z.B. als leere Variable?

Und hättest du/ihr auch eine Lösung auf das andere, oben genannte Problem parat?