Anfängerfrage zu Formularen in Zope/Plone und Python-Skript

Django, Flask, Bottle, WSGI, CGI…
Antworten
stepe
User
Beiträge: 3
Registriert: Freitag 9. Februar 2007, 11:16

Hallo... :)

Gleich vorweg, ihr habt es hier mit einem Neuling in Sachen Programmierung zu tun. Ich habe schon Bücher und das Forum nach Antworten auf meine Fragen durchsucht, bin jedoch leider gescheitert. Was nicht heißen soll, dass die Antwort nirgends steht, sondern dass ich es wahrscheinlich nicht als Antwort erkannt habe.
Deshalb wäre ich euch sehr dankbar, wenn ihr mir mit einfachen Erklärungen weiterhelfen könntet.

:!: Für meine Abschlussarbeit vom Studium, das nichts mit Informatik zu tun hat, kam ich trotzdem nicht umhin, etwas zu programmieren. Es handelt sich um ein Programm zum berechnen von ein paar mathematischen Aufgaben. Dazu hab ich mit Python etwas geschrieben und eine grafische Oberfläche mit Tkinter dazu gebastelt, was auch ohne Probleme klappt.

:?: Nun zu meiner eigentlichen Frage, die rein theoretischer Art ist. Wenn man das ganze jetzt mit Zope/Plone webfähig machen will - sprich eine Webseite als Formular mit Eingabefeldern, Button und Ausgabefeldern – wie würde das ganze dann Funktionieren?

So wie ich das jetzt verstanden habe, erstellt man in Zope/Plone eine Webseite als Formular. Trägt der User etwas ein und drückt den Button, wird der Inhalt der einzelnen Felder über „request“ an das Python-Skript (externe Methode?) übergeben, dort berechnet und das Ergebnis per „option“ (?) wieder zurückgeleitet.

Lieg ich damit falsch? Entschuldigt bitte, wenn die Frage für euch zu simpel ist, aber für mich ist sie leider sehr wichtig, da ich auch etwas unter Zeitdruck stehe. :oops: Ich danke euch schon mal im Voraus.

stepe
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Hi,

also ich beschäftige mich auch gerade mit Plone und versuche so etwas ähnliches wie du nur etwas Komplexer. Ja du kannst Forumlare/ Templates erstellen und da, so wie bei HTML Input- Felder bzw. Button erstellen. Mit Hilfe von externen Methoden (einer Python- Methode) kannst du die Werte die in die Input- Felder eingetragen wurden auslesen und mit der gewünschten Rechenart berechnen lassen. Das Ergebnis kannst du dann zurück geben und in das Input- Feld für dein Ergebnis schreiben!

mitch
stepe
User
Beiträge: 3
Registriert: Freitag 9. Februar 2007, 11:16

Ich danke dir für die schnelle Antwort :D Anders hätte ich mir das auch nicht vorstellen können.
In diesem Zusammenhang hab ich aber schnell noch zwei kleine Fragen. Ich durchschaue diese ganze Sache wie gesagt noch nicht so richtig. Man stolpert ja dauernd über DTML und HTML und all sowas... Würde ich das Formular in Zope dann in DTML oder HTML schreiben?
Und wie wäre der Weg der Daten? So etwa:
Client ---(via HTTP)---> Webserver (Apache bzw. ZServer) ------> ZODB ------> Python-Skript (externes Modul) ------> Webserver ---(via HTTP)--->Client :?:

stepe
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Ich hab mal so ein simples Rechen Template erstellt...

Zu erst hab ich mir einen Ordner gemacht und ein Template erstellt:
Control Page Template...

Code: Alles auswählen

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      lang="en"
      metal:use-macro="here/main_template/macros/master"
      i18n:domain="plone">

<body>
<div metal:fill-slot="main"
     tal:define="is_manager python: checkPermission('Manage portal', here);">

    <h1>Rechnen</h1>

  	<form action="rechenMethode"
          method="post"
		  name="search"
          tal:define="DateTime python:modules['DateTime'].DateTime">

        <fieldset>
            <!--<div tal:content="python:context.REQUEST"></div>-->
            <div class="field">
                <label>Zahl 1</label><br>
    
                <input type="text"
                       name="zahl1"
                       size="25"
                       tabindex=""
                       tal:attributes="tabindex tabindex/next;
					                   value python:context.REQUEST.get('zahl1')"
                       />
            </div>
			<div class="field">
                <label>Rechenoperation</label><br>
    
                <input type="text"
                       name="zeichen"
                       size="25"
                       tabindex=""
                       tal:attributes="tabindex tabindex/next;
					                   value python:context.REQUEST.get('zeichen')"
                       />
            </div>
			<div class="field">
                <label>Zahl 2</label><br>
    
                <input type="text"
                       name="zahl2"
                       size="25"
                       tabindex=""
                       tal:attributes="tabindex tabindex/next;
					                   value python:context.REQUEST.get('zahl2')"
                       />
            </div>
			<div class="field">
                <label>Ergebnis</label><br>
    
                <input type="text"
                       name="ergebnis"
                       size="25"
                       tabindex=""
                       tal:attributes="tabindex tabindex/next;
									   value python:context.REQUEST.get('ergebnis')"
                       />
            </div>

           <div class="formControls">
                <input class="context"
                       tabindex=""
                       type="submit"
                       name="submit"
                       value="Submit"
                       tal:attributes="tabindex tabindex/next;"
                       />
            </div>
		</fieldset>
    </form>

</div>

</body>
</html>
Bei diesem Template habe ich noch folgendes eingestellt (oben im Reiter auf Actions):
Edit default Actions:
Status: success
context: any
action: traverse_to
argument:string:rechenMethode (das ist mein python script)

Hier das Control Python Script:

Code: Alles auswählen

##Script (Python) "rechenMethode" 
##bind container=container 
##bind context=context 
##bind namespace= 
##bind script=script 
##bind subpath=traverse_subpath 
##parameters=REQUEST=None
##title= 
## 
request=context.REQUEST

zahl1=request.get('zahl1')
zahl1=int(zahl1)
zahl2=request.get('zahl2')
zahl2=int(zahl2)
zeichen=request.get('zeichen')

if zeichen=='+':
 ergebnis=zahl1+zahl2
 request.set('ergebnis',ergebnis)

return state
Bei dem Python Script hab ich auch noch folgendes Eingestellt:
Edit default Actions:
status: success
context: any
action: traverse_to
argument:string:rechner (so heißt mein template)
Die 2. default Action:
status: failure
context: any
action: traverse_to
argument:string:rechner (so heißt mein template)

So und das ist nur ein Simples Teil, ohne Valedierung, es kann nur mit "+" rechnen (wie zu sehen ist im Pythonscript, da kann man das auch erweitern) und ich haben bei der Templateseite im Header die Informationen einer bereits bestehenden Seite verwedet!

Ich hafte für nix... :P

Der Gerold kann dir da genauer auskunft geben, über die ganzen Funktionsweise und Vorgänge. Ich will dir ja nix falsches erzählen.

Bei mir ist es so, dass ich alle Informationen des Templates an die "rechenMethode" schicke (siehe im Action- Reiter und in der "Form" wo die action auch "rechenMethode" ist). Da hole ich mir die Werte aus dem Request und schreibe diese in die Variablen (zahl1, zahl2, zeichen).
Mit den Werten durchlaufe ich eine schlichte If- Anweisung (da frage ich ob ein plus eingegeben wurde) und mit REQUEST.set('ergebnis',ergebnis) setze ich den Wert im Request.
Nun gebe ich wieder alles zurück und auf der Seite werden diese Daten ebenfalls ausgewertet und den Wert des ergebnisses schreibe ich in das "Ergebnisfeld".

mfg mitch

ps: Natürlich kannst du auch ohne die Macros im Header eine Seite erstellen und auswerten lassen, allerdings fehlt dir dann die optische Gestalltung![/code]
stepe
User
Beiträge: 3
Registriert: Freitag 9. Februar 2007, 11:16

:D Das hilft mir schon unheimlich weiter! Vielen Dank! Ich werde mir das aber heut Abend noch mal ganz genau ansehen und schauen, wie ich das auf mein Beispiel anwenden kann. Muss es wie gesagt zwar eigentlich nur theoretisch beleuchten, aber es packt einen ja doch meist der Ehrgeiz.

Das Python-Skript weicht ja auch nicht allzu doll von dem ab, wie ich es mit Tkinter habe...Ich denke, ich bekomme das hin, wenn ich ein paar Nachtschichten einlege. :wink: Dein Beispiel ist für mich wirklich sehr gut nachzuvollziehen.

LG
stepe
Antworten