mod_python und PSP Handler

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Alex

Hi Schlangenfreunde,
ich habe hier nen Apache2 und mod_python am Start und habe den Server auch soweit dass ich PSP auch wie im Kapitel 4.9 von mod_python erfolgreich hingekriegt habe.
Aber kompliziertere Sachen funzen nicht.
Wie kann ich z.B. ne Funktion mit

Code: Alles auswählen

<%def blafunktion ():
    print "sag was"
    print "oder schweig"
%>
später in der pspseite aufrufen?
Und hat jemand mal mit parse () oder include file=""erfolgreich
eine externe Datei eingebunden??
Mein Ziel ist letztlich folgendes:
Ich arbeite mit content negotiation und möchte eine Sprachauswahlliste anbieten. Aber nicht alle html bzw psp Seiten sind in allen 4 Sprachen (de,fr,en,es) verfügbar.
Python soll also das aktuelle Verzeichnis scannen und alle index.psp.*
filtern und entsprechend die Sprachauswahlliste aufbauen.
Am besten wäre das in einer Datei die man in die pspseite einbindet.
ich hoffe ich war einigermaßen verständlich.
Bin für jeden Tip/Hinweis dankbar.
Alex (Pythonneuling)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich hab nicht wirklich verstanden was du machen willst und ich hab auch keinen Plan von mod_Python... Allerdings sieht es für mich so aus, also willst du Python-Code direkt in HTML Ausführen, oder? Allerdings ist so eine Code-Vermischung, wie man sie auch immer ganz häufig mit PHP macht, immer sehr unschön...
Kannst du nicht evtl. dein Problem mit SSI lösen, in dem du mit exec ein Python Skript ausführst? Die Trennung zwischen HTML und Python wäre quasi größer...

Oder hab ich dich da völlig falsch verstanden?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi jens. PSP heißt Python Server Page(s) und ist quasi wie PHP mit Python. Aber ich habe mich damit noch nie beschäftigt, von daher kann ich nicht weiterhelfen :(
Alex

jens hat geschrieben:Also ich hab nicht wirklich verstanden was du machen willst und ich hab auch keinen Plan von mod_Python... Allerdings sieht es für mich so aus, also willst du Python-Code direkt in HTML Ausführen, oder? Allerdings ist so eine Code-Vermischung, wie man sie auch immer ganz häufig mit PHP macht, immer sehr unschön...
Kannst du nicht evtl. dein Problem mit SSI lösen, in dem du mit exec ein Python Skript ausführst? Die Trennung zwischen HTML und Python wäre quasi größer...

Oder hab ich dich da völlig falsch verstanden?
Hi Jens,
du hast mich richtig verstanden.
Siehe:
http://modpython.org/live/current/doc-h ... i-psp.html
Die Idee mit SSI ist gut.
Damit habe ich mich noch nicht beschäftigt. Mal gucken wies funzt.
Eine Code-Vermischung ist uncool das gebe ich zu...
Danke jedensfalls für deine Antwort
Gruß
Alex
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Alex hat geschrieben:Die Idee mit SSI ist gut.
Damit habe ich mich noch nicht beschäftigt. Mal gucken wies funzt.
schau mal hier: http://python.sandtner.org/viewtopic.php?p=15816#15816
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich biete den hier.

Ich nutze Spyce, das ist noch viel besser als SSI, das hat schon einiges mitgeliefert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Alex

Hi,
ich habs!!
Mit SSI war es kein Problem.
Dies ist die Zeile die ich in die HTMLseite eingefügt habe:

[html]<!--#exec cmd="script/lang.py index.html.de /var/www/" -->[/html]

Das 1. Argument bezeichnet die HTMLDatei selbst, das 2. wo sie ist.
(Wahrscheinlich gibt es weitaus bessere Wege, aber meine Pythonkenntnisse sind erst 2 Tage alt.
Nun kommt lang.py

Code: Alles auswählen

#!/usr/bin/python
import os, os.path, sys

setspr = ['de','en','fr','es']
setava = ['Alternative Sprachen: ','alternative languages: ','langues alternatives: ','idiomas alternativas: ']
args = sys.argv [1]
path = sys.argv [2]

def makelink (nummer):
	temp = args+setspr [nummer]
	print '<a href="',
	print temp,
	print '">',
	print setspr [nummer],
	print '</a> |'
# makelink eof (end of function)
for x in range (3):
	if (args.endswith (setspr [x])):
		nummer = x
		args = args.strip (setspr [nummer])
print setava [nummer]
for nummer in range (3):
	if (os.path.isfile (path+args+setspr [nummer])):
		makelink (nummer)
Der Code ist bestimmt nicht hitverdächtig, aber für meine Bedürfnisse vollkommen ausreichend. :wink:
Eine Frage habe ich aber noch: Ist es normal dass print ein Leerzeichen als letztes Zeichen einfügt?
z.B.:

Code: Alles auswählen

print setspr [0]
gibt 'de ' zurück und nicht 'de' (Also mit einem Leerzeichen nach de)
Danke nochmals
Gruß
Alex
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Alex hat geschrieben:Das 1. Argument bezeichnet die HTMLDatei selbst, das 2. wo sie ist.
(Wahrscheinlich gibt es weitaus bessere Wege, aber meine Pythonkenntnisse sind erst 2 Tage alt.
Der Code ist bestimmt nicht hitverdächtig, aber für meine Bedürfnisse vollkommen ausreichend. :wink:
Also für zwei Tage Erfahrung ist das schon sehr gut :)
Alex hat geschrieben:Eine Frage habe ich aber noch: Ist es normal dass print ein Leerzeichen als letztes Zeichen einfügt?
z.B.:

Code: Alles auswählen

print setspr [0]
gibt 'de ' zurück und nicht 'de' (Also mit einem Leerzeichen nach de)
Ich denke, das hängt vom OS ab, denn unter Windows ist das scheinbar so, unter Linux nicht. Aber mit sys.stdout.write() ist es einheitlich.

Kleine Verbesserung:

Code: Alles auswählen

def makelink (nummer):
    temp = args+setspr[nummer]
    print '<a href="%s">%s</a> |' % (temp, setspr[nummer])
Somit sparst du dir einige prints.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

Leonidas hat geschrieben:Ich denke, das hängt vom OS ab, denn unter Windows ist das scheinbar so, unter Linux nicht. Aber mit sys.stdout.write() ist es einheitlich.

Kleine Verbesserung:

Code: Alles auswählen

def makelink (nummer):
    temp = args+setspr[nummer]
    print '<a href="%s">%s</a> |' % (temp, setspr[nummer])
Somit sparst du dir einige prints.
Hi Leonidas,
also ich habe hier Linux genauer DebianAMD64.
Ist aber auch nicht so schlimm. Hat mich nur gewundert. Hätte ja sein können dass es an meinem Code liegt.
Deine Verbesserung werde ich übernehmen.
Danke
Alex
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:also ich habe hier Linux genauer DebianAMD64.
Hmm... dann habe ich mich wohl geirrt... also ich habe WinXP und DebianSparc zum testen.

Ich habe sowas aber nie beobachtet... aber zur Sicherheit musst du einfach nur sys.stdout.write() nutzen, damit ist er garantiert okay. Ich finde print an sich etwas seltsam, ist so ein altes Python Relikt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

Leonidas hat geschrieben:Ich habe sowas aber nie beobachtet... aber zur Sicherheit musst du einfach nur sys.stdout.write() nutzen, damit ist er garantiert okay. Ich finde print an sich etwas seltsam, ist so ein altes Python Relikt.
Was? Kein print? :cry:
Das erinnert mich aber so an meinen C64 :)
Das waren noch Zeiten (schnüff, heul, Träne verdrück)
Ciao
Alex
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:Was? Kein print? :cry:
Natürlich kannst du es nutzen wenn du magst. Aber PEP 3000 (Python 3.0 oder eher 3k) sieht ein Entfernen vor. Das liegt daran, dass es keine Funktion ist, sondern ein Schlüsselwort. Aber dieses Schlüsselwort wird praktisch wie eine Funktion benutzt, deswegen ist das etwas seltsames. Ich finde es ist ein Designproblem aus den frühen Tagen von Python. Aber bis Python 3k ist es noch einiges hin, deswegen kannst du auch ruhig print benutzen. Also ich freu mich schonmal auf Python 3k, die umstrukturierungen dort finde ich (größtenteils) gut.. bis auf optionale statische Typen.
Anonymous hat geschrieben:Das erinnert mich aber so an meinen C64 :)
Viele Programmiersprachen haben print, so auch Ruby.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Alex

Hi,
nachdem ich ne Weile mit Python und Webseiten gespielt habe, stelle ich fest dass SSI keine Lösung ist. Das frisst zuviel Resourcen.
Nun habe ich eben mal richtig reingehängt und nun klappts auch mit dem mod_python richtig gut und ist wesentlich effektver als SSI. Was ja auch irgendwo logisch ist, dass das zügiger arbeitet.
Wollte ich bloss mitteilen falls jemand auch mit dem Gedanken spielt...

Gruß
Alex
StefanK

Hallo Alex,
wenn du mod_python verwendest, solltes du statt print die Methode req.write("Text") verwendet.

req (Originalton): "The request object is a Python mapping to the Apache request_rec structure. When a handler is invoked, it is always passed a single argument - the request object. "

Beispiel aus einer psp-Datei:
<%
def german_date(isodate):
[jahr,monat,tag] = string.split(isodate,"-")
req.write(tag+'.'+monat+'.'+jahr)
%>

Grüsse und alles Gute

Stefan
Gast

StefanK hat geschrieben:Hallo Alex,
wenn du mod_python verwendest, solltes du statt print die Methode req.write("Text") verwendet.

req (Originalton): "The request object is a Python mapping to the Apache request_rec structure. When a handler is invoked, it is always passed a single argument - the request object. "

Beispiel aus einer psp-Datei:
<%
def german_date(isodate):
[jahr,monat,tag] = string.split(isodate,"-")
req.write(tag+'.'+monat+'.'+jahr)
%>

Grüsse und alles Gute

Stefan
Hi Stefan,
ja ich weiß. Geht auch gar nicht anders.
Es muss über den Handler erfolgen. Eine print Anweisung schreibt das sonstwo hin, keine Ahnung wohin (Console??)
Gruß
Alex
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:Es muss über den Handler erfolgen. Eine print Anweisung schreibt das sonstwo hin, keine Ahnung wohin (Console??)
Man könnte (ungetestet)

Code: Alles auswählen

import sys
sys.stdout = req
machen, dadurch sollte print nach req schreiben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten