Wie HTML von CGI/Python trennen?

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo Leute.
Ein minimales Beispiel:
Diese Form liest zwei Zahlen ein, die die Grenzen eines Intervalls darstellen.

Code: Alles auswählen

<html>
  <head>
      <title>HTML Formatting Example</title>
  </head>
  <body>
      <form name="getValuesForm" action="./getRandomNumber.cgi">
          <h2>Start External Function.</h2>
          Return a random number in the given intervall.<br />
          <p>
          Lower Boundary of the Intervall.<br />
          <input type="text" name="lowerBoundary" value="0"><br />         
          Upper Boundary of the Intervall.<br />
          <input type="text" name="upperBoundary" value="10"><br />
          <input type="submit" name="getRandomNumber" value="Get Random Number">
          </p> 
      </form>  
</body>
</html>
Wenn die Form übermittelt wird erscheint eine neu erstellte Seite, die die beiden Grenzen angibt. Diese wird mit dem CGI Skript erzeugt.

Code: Alles auswählen

#!/usr/bin/python

print "Content-type: text/html\n\n"

import cgi
import cgitb
cgitb.enable()

import random

form = cgi.FieldStorage()

def getRandomNumber(lower, upper):
    return random.randint(lower, upper)

def getPage(lower, upper):
    newPage = ''
    newPage += '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n'
    newPage += '<html>\n'
    newPage += '<head>\n'
    newPage += '<title>Random Number String Formatting HTML Example</title>\n'
    newPage += '</head>\n'
    newPage += '<body>\n'
    newPage += '<h2>Random Number Interval Entered:</h2>\n'
    newPage += 'Lower Intervall Boundary: %s<br />\n'
    newPage += 'Upper Intervall Boundary: %s<br />\n'
    newPage += '</body>\n'
    newPage += '</html>\n'

    return newPage % (lower, upper)

if __name__ == '__main__':
    lower = form['lowerBoundary'].value
    upper = form['upperBoundary'].value
    randomNumber = getRandomNumber(int(lower), int(upper))
    print getPage(lower, upper)
Ich will den HTML Teil in einem separaten .html File haben (bessere Lesbarkeit mit Syntax Highlighting). Wie kann ich dann aber die String-Formatting "Platzhalter" ausfüllen mit den beiden Werten wenn ich die Seite anzeigen möchte?
[url=http://www.proandkon.com]proandkon.com[/url]
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Bootle oder Flask und die entsprechende Template Sprache nutzen...
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

.robert hat geschrieben:Bootle oder Flask und die entsprechende Template Sprache nutzen...
Seh ich das richtig, mit Flask kann ich sozusagen Python innerhalb von HTML ausführen?
[url=http://www.proandkon.com]proandkon.com[/url]
deets

Mit allen Template-Implementierungen kannst du das, ueblicherweise in einem aus guten Gruenden recht beschraenkten Masse - sonst waerst du bei PHP.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du unbedingt bei CGI bleiben willst: Das String-Modul aus Python kennt auch Templates Link.

Aber grundsätzlich fährst du mit WSGI und einen entsprechendem (oben bereits genanntem) Framework besser - nicht nur, weil Bottle, Flask & Co. Template-Engines mitbringen, sondern auch weil das Routing, Handling von Request-Daten etc. komfortabler ist.

Gruß, noisefloor
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Die Übertragung des Programms in ein Framework steht schon lange an. Im Moment müssen noch zwei Funktionen eingeführt werden, damit der Chef zufrieden ist. Dann wird refactoriert.

@Noisefloor: Im Moment muss ich das mit CGI lösen. Danke für den Hinweise auf die Templates, ich schaus mir an.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Man kann Jinja2 und Co. ja auch mit CGI betreiben - man kann sie ja auch außerhalb der Webprogrammierung nuzten. So schwer ist das Setup von J2inja auch nicht.

Da Du da sehr viele form-Elemente hast: Da solltest Du aber mal dringend über Wtforms o.ä. nachdenken.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

nur damit ich es mir ungefähr vorstellen kann, was würde sich denn in meinem obigen Beispiel mit Hilfe eines Frameworks (z.B. Bottle) verändern?
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben:nur damit ich es mir ungefähr vorstellen kann, was würde sich denn in meinem obigen Beispiel mit Hilfe eines Frameworks (z.B. Bottle) verändern?
Naja, Du hättest eben ein Template-File und würdest wohl eine Route für Deine `getPage`-Funktion anlegen. (Der Name ist übrigens nicht PEP8 konform)

Am besten schaust Du Dir einfach mal die Doku und das Tutorial zu bottle / flask an.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

hm, wäre generatePage besser?
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben:hm, wäre generatePage besser?
Von der Bedeutung schon - wobei die meisten Routen bei der Webprogrammierung ja Seiten "erstellen".

Formal sollten Funktionen und Methoden laut PEP8 "klein_und_mit_unterstrichen" geschrieben werden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten