Pythonskripte ausserhalb cgi-bin aufrufen

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
Benutzeravatar
aLeX_
User
Beiträge: 6
Registriert: Montag 19. Juni 2006, 15:35

Montag 19. Juni 2006, 16:13

Hi,

ich will mich gleich mal als Python-Newbie outen, damit wir das hinter uns haben :shock:

Ich habe schon einige kleine Python-Skripte geschrieben, und führe Sie immer aus dem ../cgi-bin/....Verzeichnis heraus auf (klappt prima). Kann ich .py-Dateien auch in einem x-beliebeigen Verzeichnis unterhalb des DocRoot´s meines Apache ausführen ??? muss doch gehen !! geht ja auch mit php etc. außerdem habe ich auch Zope zum Laufen gekriegt allerdings auf einem anderen Server.
Ich bin meine httpd.conf oft durchgegangen, aber beim anklicken einer meiner .py-Dateien unterhalb des DocRoot, fragt mich mein Browser mit welcher Application ich die Datei öffnen will oder ob ich die Datei speichern möchte.
O.K. mir ist klar das mein Server ganz offensichtlich nicht weiß wie er mit diesem Datteityp umgehen soll, aber ich habe soweit alles eingerichtet.

Code: Alles auswählen

<Directory "/srv/www/htdocs/python">
       # AddHandler python-program .py
        Addhandler mod_python .py
        AddType application/x-httpd-py .py
        PythonHandler hallo
        PythonDebug On
        Order allow, deny
        Allow from all
</Directory>
vielleicht sieht ein etwas geübteres Pythen-Auge als das Meine den Fehler.

zweite Frage:
Ich habe ein Skript, das ein Formular zum ausfüllen bereitstellt. Nach dem Abschicken verarbeitet ein Pythonskript die Datei - nur leider mit einem Fehler der mir nicht klar ist, da mir die interne Verarbeitung von Python noch nciht so ganz klar ist.

....Sorry für evtl. etwas zu viel Code in meinem Post. Aber so erkennt man wenigstens was...

Mein code:

Code: Alles auswählen

#------------------------
class FormData:
#------------------------
	"""A repository for information gleaned from a CGI form"""
	def __init__(self, form):
		self.time = time.asctime()
		for fieldname in self.fieldnames:
			if fieldname not in form or form[fieldname].value == "":
				bail()
			else:
				setattr(self, fieldname, form[fieldname].value)

#--------------------------------------
class FeedbackData(FormData):
#--------------------------------------
	"""A Formdata generated by the comment.html form."""
	fieldnames = ('name', 'vorname', 'type')
	def __repr__(self):
		return "%(typs)s from %(name)s on %(time)s" % vars(self)


if __name__ == '__main__':
	sys.stderr = sys.stdout
	form = cgi.FieldStorage()
	data = FeedbackData(form)

Python-Errorausgabe:

/srv/www/cgi-bin/feedback.py
63 data = FeedbackData(form)
data undefined, FeedbackData = <class __main__.FeedbackData>, form = FieldStorage(None, None, [MiniFieldStorage('name...MiniFieldStorage('send', 'Submit that shit ;)')])

/srv/www/cgi-bin/feedback.py in __init__(self=<FeedbackData instance>, form=FieldStorage(None, None, [MiniFieldStorage('name...MiniFieldStorage('send', 'Submit that shit ;)')]))
42 self.time = time.asctime()
43 for fieldname in self.fieldnames:
44 if fieldname not in form or form[fieldname].value == "":
45 bail()
46 else:
fieldname = 'name', form = FieldStorage(None, None, [MiniFieldStorage('name...MiniFieldStorage('send', 'Submit that shit ;)')]), ].value undefined

? in __getitem__(self=FieldStorage(None, None, [MiniFieldStorage('name...MiniFieldStorage('send', 'Submit that shit ;)')]), key=0)

KeyError: 0
__doc__ = 'Mapping key not found.'
__getitem__ = <bound method KeyError.__getitem__ of <exceptions.KeyError instance>>
__init__ = <bound method KeyError.__init__ of <exceptions.KeyError instance>>
__module__ = 'exceptions'
__str__ = <bound method KeyError.__str__ of <exceptions.KeyError instance>>
args = (0,)


Mir ist einfach nicht ganz klar was genau der Fehler in Zeile 44 sein kann.
Und die Fehlerausgabe kann ich nur ungenau deuten, es geht wohl um eine falsche Konvertierung .

Vielen Dank im Voraus

aLeX...

Edit (Leonidas): Code in Python-Tags gesetzt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 19. Juni 2006, 18:31

Erstens vergisst du ganz schnell, jemals von mod_python gehört zu haben.

Zweitens setzt du das in deine httpd.conf:

Code: Alles auswählen

AddHandler cgi-script .py # oder .cgi wenn deine CGIs mit .cgi enden
Options +ExecCGI
Alternativ auch diesen Post lesen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
aLeX_
User
Beiträge: 6
Registriert: Montag 19. Juni 2006, 15:35

Dienstag 20. Juni 2006, 09:07

Hallo Leonidas,

danke für die prompte Antwort.

Allerdings verstehe ich Deine für mich noch! unbegründete Asssage bzgl. mod_python nicht.

An der Pythonshell zu arbeiten ist eine Sache, im Web mit Python eine Andere. Ich vermisse ein wenig klare, erklärende Strukturen um Möglichkeiten und Alternativen zu erkennen, Gestern habe ich noch wiki.python entdeckt, das halte ich für ein unterstützenswertes Projekt, welches Grundlegende Punkte der Python-Welt erfaßt. Mit Büchern über Syntax und Semantik wird man ja überflutet, wobei hier auch ganz klar Quantität != Qualität ist.

Ich mache wohl irgendetwas falsch, da ich die beiden Zeilen aus meinem CGI-BIN Verzeichnis kenne:

Code: Alles auswählen

<Location /cgi-bin>
AddHandler cgi-script cgi 
AllowOverride All
Options +ExecCGI -Includes
SetHandler cgi-script
</Location>

Code: Alles auswählen

<Directory "/srv/www/htdocs/python">
       AddType application/x-httpd-py .py
       AddHandler cgi-script .py
       Options +ExecCGI
</Directory>

Ich habe gerade auch noch mein <DIRECTORY> auskommentiert und nach allem nicht gelingen eine .htaccess mit besagten 2 Zeilen erstellt. Danach ein Apache Restart, leider ohne Erfolg, mein Server kennt immer noch nicht die Dateiendung .py
Naja wird schon irgendwann.

Hast Du den auch eine Idee bzgl. meines Codeproblems (ich bin auch kein Informatikstudent ;) )


Dir nen schönen Tag und ein tolles Spiel um 16 Uhr.

hasta tarde

aX.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 20. Juni 2006, 15:53

aLeX_ hat geschrieben:Allerdings verstehe ich Deine für mich noch! unbegründete Asssage bzgl. mod_python nicht.
Das kann ich dir ein wenig erklären: viele Leute denken, dass mod_python so in etwa funktioniert wie mod_php. Das ist jedoch keineswegs der Fall, mod_python wird inzwischen eigentlich nur noch als Anbindung an Apache genutzt, etwa so: Python-Code <---> Framework <---> mod_python <---> Apache. Mit mod_python direkt zu arbeiten ist dagegen nicht empfoheln weil mod_python dermassen problematisch ist, dass davon abzuraten ist (ich könnte die Funktionsweise von mod_python noch ein wenig weiter ausführen, aber das wäre eher etwas für eine Wikiseite, in dem von dir angesprochenen Wiki, welches eigentlich von den gleichen Leuten wie dieses Forum betrieben wird). Da die meisten Leute allerdings etwas eher etwas wie PHP erwarten, wäre Python über CGI eher das was sie sich vorstellen.
aLeX_ hat geschrieben:An der Pythonshell zu arbeiten ist eine Sache, im Web mit Python eine Andere.
Absolut, vor allem da [wiki]Python im Web[/wiki] keineswegs eine so einfache Sache ist, da es zig Möglichkeiten gibt, mit Python Webseiten zu generieren. Es gibt jedoch empfehlenswerte Möglichkeiten und weniger empfehlenswerte Möglichkeiten. So nutze ich das Web-Framework Django, welches mir viele Dinge wie Datenbank und Templates, Sessions usw in die Hand gibt, angebunden über FastCGI an den Apache. Allerdings erfordert dieser Ansatz eine andere "Denkweise" als PHP, wenn man erst dahintersteigt ist sie sogar wesentlich angenehmer. Aber auch PHP-Clones wie Spyce oder Karigell gibt es in Python.
aLeX_ hat geschrieben:Ich vermisse ein wenig klare, erklärende Strukturen um Möglichkeiten und Alternativen zu erkennen
Daher wäre es vielleicht eine gute Idee, nicht mit Webprojekten in Python einzusteigen. Denn obwohl viele Leute in Ruby über Rails einsteigen, halte ich das für keine sonderlich gute Möglichkeit die Konzepte der Sprache zu lernen, weil sie dann mehr das Framework als die Sprache lernen. Mit GUIs ist es auch so: für den Einstieg sind Konsolenprogramme am besten, weil sie einem die Grunglegenden Konzepte imho am besten aufzeigen können.
aLeX_ hat geschrieben:Mit Büchern über Syntax und Semantik wird man ja überflutet, wobei hier auch ganz klar Quantität != Qualität ist.
Ein meiner Meinung nach sehr gutes gedrucktes und Online-Buch ist Dive into Python, wobei das sich allerdings nicht an den totalen Einsteiger in Sachen Programmierung richtet, sondern eher an Menschen die die grundlegenden Konzepte imperativer Programmierung verstehen (und dennoch für Leute die Python bereits können noch interessant ist). Einen guten Einstieg überhaupt bietet Wie ein Informatiker denken lernen. Es sei natürlich auch noch der Klassiker das Python Tutorial erwähnt, welches eine eher nüchterne Herangehensweise hat.
aLeX_ hat geschrieben:Ich mache wohl irgendetwas falsch, da ich die beiden Zeilen aus meinem CGI-BIN Verzeichnis kenne:

Code: Alles auswählen

<Location /cgi-bin>
AddHandler cgi-script cgi 
AllowOverride All
Options +ExecCGI -Includes
SetHandler cgi-script
</Location>
Genau das sind die Zeilen, die du benötigst. Wenn du in der AddHandler-Direktive cgi gegen py eintauscht werden py-Dateien ausgeführt (wobei der Dateiname ist eigentlich egal, eine hallowelt.cgi kann sowohl einn Python, Perl, Rubyskript sein, als auch ein C-Programm).

aLeX_ hat geschrieben:

Code: Alles auswählen

<Directory "/srv/www/htdocs/python">
       AddType application/x-httpd-py .py
       AddHandler cgi-script .py
       Options +ExecCGI
</Directory>

Ich habe gerade auch noch mein <DIRECTORY> auskommentiert und nach allem nicht gelingen eine .htaccess mit besagten 2 Zeilen erstellt. Danach ein Apache Restart, leider ohne Erfolg, mein Server kennt immer noch nicht die Dateiendung .py
Naja wird schon irgendwann.
Was passiert wenn du das mal versuchst?

Code: Alles auswählen

<Location />
AddHandler cgi-script py
AllowOverride All
Options +ExecCGI -Includes
SetHandler cgi-script
</Location>
aLeX_ hat geschrieben:Hast Du den auch eine Idee bzgl. meines Codeproblems (ich bin auch kein Informatikstudent ;) )
Ähm, mir wäre es lieber pro Thread nur ein Problem zu lösen, das ist einfacher und die Suchfunktion hat dann mehr davon. Davon mal abgesehen ist es nicht so, dass wir Fragen von Informatikstudenten nicht beantworten wollen, sondern nur keine Hausaufgaben lösen wollen (eher so in Richtung "Hilf dir selbst zu helfen", wenn du verstehst).
aLeX_ hat geschrieben:Dir nen schönen Tag und ein tolles Spiel um 16 Uhr.
Danke, ich bin zwar kein Fussballfan, aber trotzdem ;) Schönen Tag noch :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
aLeX_
User
Beiträge: 6
Registriert: Montag 19. Juni 2006, 15:35

Mittwoch 21. Juni 2006, 15:50

Leonidas hat geschrieben:(ich könnte die Funktionsweise von mod_python noch ein wenig weiter ausführen, aber das wäre eher etwas für eine Wikiseite, in dem von dir angesprochenen Wiki, welches eigentlich von den gleichen Leuten wie dieses Forum betrieben wird).
Ich wäre ein dankbarer Leser ;)
Leonidas hat geschrieben: ...vor allem da [wiki]Python im Web[/wiki] keineswegs eine so einfache Sache ist, da es zig Möglichkeiten gibt, mit Python Webseiten zu generieren.

Genau davon rede ich. Syntax und Semantik wird zum ershclgane angeboten aber keine generellen Konzepte.
Leonidas hat geschrieben: Es gibt jedoch empfehlenswerte Möglichkeiten und weniger empfehlenswerte Möglichkeiten. So nutze ich das Web-Framework Django, welches mir viele Dinge wie Datenbank und Templates, Sessions....
Das ist doch ein TopTip, hier werde ich einsteigen und mir das mal ansehen...danke.
Leonidas hat geschrieben: Daher wäre es vielleicht eine gute Idee, nicht mit Webprojekten in Python einzusteigen. Denn obwohl viele Leute in Ruby über Rails einsteigen, halte ich das für keine sonderlich gute Möglichkeit die Konzepte der Sprache zu lernen, weil sie dann mehr das Framework als die Sprache lernen. Mit GUIs ist es auch so: für den Einstieg sind Konsolenprogramme am besten, weil sie einem die Grunglegenden Konzepte imho am besten aufzeigen können.
Yeph da gebe ich Dir vollstens Recht. Aber das hier ist auch nicht mein erstes CMS-Projekt, die grundlegenden Strukturen und Mechanismen sind mir wohl bekannt. Allerdings muß ich zugeben bisher mit PHP gearbeitet
zu haben - im Bereich CMS, Was wie Du richtig sagst, eine super Skriptsprache ist um in den Bereich der CMS einzusteigen. Ich bin auch nicht an die procedurale Programmierung gebunden, objektorientierung ist mir bekannt.

Aber im Moment ist bei mir Python angesagt und damit möchte ich in Zukunft gerne entwickeln, schon aus dem Grund heraus das ich PHP nur für das Lernen für gut halte im etwa so wie Pascal - auch wenn das einige Leute anderst sehen.

Leonidas hat geschrieben:Dive into Python,
Das habe ich schon angelesen, habe aber nix wirklich interessantes zum Thema Webproggen gefunden, das wird wieder interessant, wenn ich die ganzen Konzepte verinnerlicht habe.
Leonidas hat geschrieben: Wie ein Informatiker denken lernen.
So denke ich bereits ;) aber ich werde einen Blick drauf werfen.
Leonidas hat geschrieben: Es sei natürlich auch noch der Klassiker das Python Tutorial erwähnt, welches eine eher nüchterne Herangehensweise hat.
Das kenne ich auch schon.

Leonidas hat geschrieben:

Code: Alles auswählen

<Location />
AddHandler cgi-script py
AllowOverride All
Options +ExecCGI -Includes
SetHandler cgi-script
</Location>
Yepp habe ich gemacht und werde immer noch von meinem Server gefragt, was ich mit dieser Datei machen will.
Ich gehe einfach nochmal sklavisch alles durch in der httpd.conf, das kann ja alles nicht sein ;)

Das mit dem Codebeispiel ist auch egal, und wenn erstelle ich nen neuen Threat
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 21. Juni 2006, 16:37

aLeX_ hat geschrieben:Ich wäre ein dankbarer Leser ;)
Der mod_python Handler funktioniert in etwa so, dass er alle Requests die an mod_python gerichtet sind an diese Handler-Datei (mptest.py), die dann mit dem Request was auch immer macht. Siehe So what Exactly does Mod-python do?, wo ganz unten steht, dass mod_python bei Jedem Request der auf eine .py Datei zeigt myscript.py aufruft. Inzwischen gibt es noch weitere Möglichkeiten von mod_python wie den Publisher und die Python Server Pages oder CGI-Handler, allerdings ist mod_python auch nicht ganz astrein und stellt sich manchmal quer, was es eher ungeeignet macht fürs direkte Entwickeln. Man kann aber [wiki]WSGI[/wiki] über mod_python anbinden, was schon eher interessant ist. Dann nutzt man mod_python aber auch nur als eine Art Gateway.
aLeX_ hat geschrieben:Syntax und Semantik wird zum ershclgane angeboten aber keine generellen Konzepte.
Das liegt einfach daran, das du alles möglcihe machen kannst. Wenn du PHP-like Code in deinen HTML Seiten haben willst, dann nimmst du Spyce oder Karrigell (oder vielleicht mod_pythons PSP), wenn du einen Application Server willst der alle Lösungen für alle Probleme mitbringt die die vielleicht haben würdest nimmst du Zope (dazu gibt es allerdings Bücher). Zope erschlägt dann alle Probleme und wenn du nicht aufpasst auch dich und deinen Server. Wenn du einen in Python geschriebenen HTTP Server haben willst, der allerhand verschiedene Python Module für alle möglichen aufgaben wie Datenbankzugriff, Templates usw verwendet nimmst du TurboGears (ein Buch ist in der mache und es gibt viele Videos). Wenn du ein sehr für CMS geeignetes Framework willst, dass alles selbst bereitstellt und eine einheitliche API hat und in produktivem EInsatz ist, dann nimmst du Django (auch hier ist ein Buch in der Mache).
aLeX_ hat geschrieben:Das ist doch ein TopTip, hier werde ich einsteigen und mir das mal ansehen...danke.
Wenn du dir mal Djnago in Aktion sehen willst, dann guck dir mal django.benitum.de an, dort habe ich so kleine Projekte laufen. Am längsten dauerte tatsächlich die Installation. Der erste Request dauert etwas länger, da die FastCGI-Server erst angeworfen werden, die nachfolgenden sind dagegen meist sehr schnell.
aLeX_ hat geschrieben:Aber das hier ist auch nicht mein erstes CMS-Projekt, die grundlegenden Strukturen und Mechanismen sind mir wohl bekannt.
Wunderbar. Denn Django ist stark auf das erstellen von CMS-artigen Seiten optimiert.
aLeX_ hat geschrieben:Allerdings muß ich zugeben bisher mit PHP gearbeitet zu haben - im Bereich CMS, Was wie Du richtig sagst, eine super Skriptsprache ist um in den Bereich der CMS einzusteigen.
Naja, ob super :/ Nachdem ich von PHP an den Code-in-HTML gewöhnt habe, nutzte ich anfangs auch in Python Spyce. Würde ich inzwischen nicht machen, da sowas eher unsauber ist.
aLeX_ hat geschrieben:Yepp habe ich gemacht und werde immer noch von meinem Server gefragt, was ich mit dieser Datei machen will.
Ich gehe einfach nochmal sklavisch alles durch in der httpd.conf, das kann ja alles nicht sein ;)
Zur Not kannst du noch die Apache-Leute fragen, die haben den Server ja schließlich verbrochen ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten