mod-python schnuppern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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.
Zuletzt geändert von gerold am Mittwoch 2. Mai 2007, 13:20, insgesamt 2-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

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?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Xabyt hat geschrieben:oder gibt es da eine andere möglichkeit, also dass ich dieses "?home" anhängsel auslesen kann
Hi Xabyte!

So einen Anhängsel

Code: Alles auswählen

http://localhost:8888/cgi-bin/cgi_info.py/?ordnername/seitenname.html
--> "?ordnername/seitenname.html" kannst du mit ``sys.argv[1]`` einlesen. Allerdings hast du dann keine Chance mehr, ein zusätzliches Argument als GET-Variable zu übergeben. Du **musst** dann Argumente per POST übergeben.
Ich kann mich aber auch täuschen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Genau sowas meine ich, sagmal bei deiner Seite konnte ich Adressen wie "Unterkategorie/unterordner/" entdecken, erstellst du für jede Kategorie Unterordner oder hast du da einen Trick dass aus z.B. seite xyz.htm www.test.de/xyz oder ?xyz wird, mir ist wie gesagt nur ?seite=xyz geläufig. und wie funktioniert das Listenelement und/oder Funktion (?) sys.argv[1] ?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Xabyt hat geschrieben:erstellst du für jede Kategorie Unterordner oder hast du da einen Trick dass aus z.B. seite xyz.htm www.test.de/xyz oder ?xyz wird, mir ist wie gesagt nur ?seite=xyz geläufig. und wie funktioniert das Listenelement und/oder Funktion (?) sys.argv[1] ?
Hi Xabyt!

Ich nehme an, du sprichst von meiner Website. -- Ich hatte nicht viel Zeit als ich die Site erstellt habe. Sie ist mit Plone http://plone.org/ gemacht. Plone baut auf dem Web-Applikationsserver Zope http://zope.de/ http://zope.org/ auf.

Ich fasse gerne Dinge in einem Ordner zusammen, die ich für eine Seite (nicht engl. "Site") brauche; Bilder oder sonstige Komponenten einer Seite kommen alle in den Ordner. Statt viele HTML-Seiten in einem Ordner habe ich lieber viele Ordner mit einer HTML-Seite. Natürlich gibt es Bilder die in vielen Seiten wiederverwendet werden. Diese kommen natürlich in einen eigenen Sammelordner.

Im Zope muss so eine Seite "index_html" heißen, dann wird sie angezeigt, wenn im URL nur der Ordnername angegeben wird. Im Apachen heißt so eine Seite standardmäßig "index.html". Man kann aber für jeden Ordner genau einstellen, wie die Seite heißen soll, die geladen wird wenn als URL nur der Ordner angegeben wird. Siehe: http://httpd.apache.org/docs/2.2/mod/mod_dir.html Man kann, glaube ich, auch Python-Dateien angeben.

Wenn du mehr mit CGI machen möchtest, dann würde ich mir sofort den Apachen installieren und die Konfiguration so umbiegen, dass nicht nur der "cgi-bin"-Ordner für CGI-Skripte zuständig ist. So kannst du dir deine Anwendungsstruktur selber einteilen. Siehe: http://httpd.apache.org/docs/2.2/howto/cgi.html

Code: Alles auswählen

/myapplication/
  |- myapplication.py
  |- index.py
  |- bild1.jpg
  |- bild2.jpg
  |- kontakt/
  |    |- index.py
  |    |- bild1.jpg
  |    |- bild2.jpg
  |- lebenslauf/
  |    |- index.html
  |    |- bild1.jpg
  |    |- bild2.jpg
  |- hauptkategorie/
       |- index.py
       |- bild1.jpg
       |- bild2.jpg
       |- unterkategorie/
            |- index.py
            |- bild1.jpg
            |- bild2.jpg
Ein positives CGI-Beispiel: http://ephemeriden.com/

CGI ist einfach und portabel. Man sollte, meines Erachtens, damit Erfahrung sammeln, aber für spätere Projekte sollte man sich ein gutes Web-Framework aussuchen. Und leider sind wir uns in der Python-Community nicht einig, welches Framework "das Beste" ist.

Ich zeige mal ein paar auf:

- Karrigell: klein, einfach, in wenigen Stunden beherrschbar

- Zope: mittelgroß, Basis in wenigen Tagen beherrschbar

- Plone (CMS, das auf Zope aufbaut): groß, in wenigen Wochen beherrschbar

- Django: ???, ???

- Turbo Gears: ???, ???

- Colubrid: klein, ???

...

mfg
Gerold
:-)
Zuletzt geändert von gerold am Mittwoch 2. Mai 2007, 15:46, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Gut, ich glaube ich werde mit CGI arbeiten. Aber sag mal folgendes Skript welches ich auf drweb.de gefunden habe funktioniert anscheinend nur mit CGI-skripten. Wie muss ich es umändern/gestalten dass man auch an ein PHP Skript eine Antwort senden kann?

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" 
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Xabyt hat geschrieben:Wie muss ich es umändern/gestalten dass man auch an ein PHP Skript eine Antwort senden kann?
Hi Xabyte!

Bitte präzisiere deine Frage (Was willst du genau damit erreichen?) und stelle sie bitte in einem neuen Thread.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Xabyt
User
Beiträge: 32
Registriert: Montag 30. April 2007, 14:05

Mach ich, sonst wird das hier doch ein wenig voll. Ich heiße übrigens Xabyt ohne e :)
Antworten