Wie kann ich Python mitteilen wo eine Aktion ausgeführt wird

Django, Flask, Bottle, WSGI, CGI…
Antworten
AqA
User
Beiträge: 5
Registriert: Freitag 16. März 2007, 14:17
Kontaktdaten:

Hallo,

zuerst einmal möchte ich mich kurz vorstellen. Ich bin der AqA und entwickle schon seit ein paar Jahren eigene CMS unter Zope. Normalerweise für größere Applikationen und deswegen mit MySQL als Datenspeicher. Jetzt bräuchte ich für eine private Seite, mit ca. 5 Unterseiten ein winziges CMS, was ich natürlich gerne wieder selbst schreibe, scheitert leider an mangelnden Python Kenntnissen.

Verwendete Versionen
Zope Version: Zope 2.10.2-final, python 2.4.4, linux2
Python Version: 2.4.4 (#2, Jan 13 2007, 18:15:24) [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)]
System Platform: linux2 (Debian Etch)

Leider habe ich mich bisher kaum mit Python beschäftigt, und nun möchte ich aber etwas tiefer einsteigen. Das ein oder andere Python Script wurde auch schon funktionsfähig eingesetzt, doch leider hapert es oft bei den, ich hoffe, eher simplen Problemen.

Ich hoffe mal, dass hier noch ein paar Zope-Jünger unterwegs sind, die mir bei meinem Problem helfen können.

Problem:
Ich habe ein kleines "CMS" geschrieben, also kleiner gehts wohl kaum, welches DTML-Documents als Objekte für die einzelnen Seiten benutzt. Nun habe ich also eine HTML-Seite mit Formular erstellt, welche im Endeffekt nur den eigentlichen Inhalt des DTML-Documents, sowie dessen Title überschreibt. Dazu nutze ich die manage_edit Funktion von Zope. Das ganze funktioniert momentan auch ganz gut, allerdings wollte ich gerne die Content-Seiten (also die DTML Documents) in einem extra Ordner speichern (sagen wir mal im Ordner "/projekt/dokumente") das Python-Script und die Formular-HTML-Seite aber in einem anderen Ordner (sagen wir mal im Ordner "/projekt/cms"). Genau dabei entsteht mein Problem.

Hier mal eben zwischendurch mein Python-Script:

Code: Alles auswählen

from Products.PythonScripts.standard import html_quote
request = container.REQUEST
RESPONSE =  request.RESPONSE

context[page_url].manage_edit(page_content,page_title)

RESPONSE.redirect(page_redirect)
Dieses Script nimmt folgende Parameter an:

Code: Alles auswählen

page_redirect,page_url,page_title, page_content
Der Paramter page_url enthält aus der Form zur Zeit nur den eigentlichen Namen, also die ID, des DTML-Documents. page_content ist natürlich der Inhalt der Textarea, page_title die Überschrift aus der Form und schließlich page_redirect enthält die Rücksprungadresse nach erfolgreichem schreiben in das DTML-Document.

Bei Bedarf, kann ich den Code des HTML-Formulars auch gerne posten, ich denke aber, das dies überflüssig ist.

Nun also zurück zu meinem Problem, wenn ich alles in einem Ordner liegen habe (sagen wir mal im Ordner "/projekt"), und dem Script als Beispiel folgende Daten übergebe:

page_redirect: "/projekt/index_html"
page_url: "content1_html"
page_title: "Meine Headline"
page_content: "text text text"

dann überschreibt er das DTML-Document mit ID "content1_html" mit den angegebenen Daten, alles wie gewünscht. Wenn ich aber jetzt versuche, das ganze in die, wie oben erwähnt, unterschiedlichen Ordner zu packen, und dann von der Form aus mein Python-Script als action aufrufe, dann stimmt der "context" ja nicht mehr, sprich mit "context[page_url]" kann ich nicht mehr auf das Objekt zugreifen.

Frage:
Wie müsste ich das Python-Script, die Form oder was auch immer anpassen, damit ich die eigentlichen DTML-Documents (Inhaltsseiten) in einen anderen Ordner legen kann, als das ausführende Python-Script?

Ich bin mir nicht ganz sicher, ob "Namespace" der richtige Begriff dafür ist, deswegen habe ich auch leider in der Suche bisher nichts passendes gefunden, evtl. ist es aber auch einfach zu trivial :)

Wenn mir zusätzlich noch jemand ein gutes Buch bzgl. Python in Zope empfehlen kann, wäre klasse. Gerne auch legale Internet-Ressourcen (HTML / PDF) da kostenlos :wink:

Schon mal im voraus vielen Dank fürs Lesen und Helfen! Wenn ich kann, werde ich mich gerne revanchieren...
Wofür klammern, wenn man auch einrücken kann ;)
Antworten