cherrypy und Formulare

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Sonntag 11. Mai 2008, 23:01

Hallo,

ich habe hier ein Formular mit 16 Textboxen. Aus den Textboxen bekomme ich ein paar Zahlen, mit denen ich dann ein wenig herumrechnen möchte. Nach dem CherryPy-Tutorial müsste ich das dann in dieser Form schreiben:

Code: Alles auswählen

class Root:
    def doLogin(self, username=None, password=None):
        # check the username & password
        ...
    doLogin.exposed = True
Das funktioniert selbstverständlich auch so, ich frage mich nur ob es da vielleicht eine einfachere(=weniger Tipparbeit)/schönere(nicht so viele Zeilen einnehmende) Möglichkeit gibt? Wenn man mehrere solcher Formulare hat, finde ich, dass der Quelltext recht unleserlich wird, wenn man für die def-Zeile der Methode immer 8 Zeilen benötigt (ok, vielleicht sollte ich kürzere Namen vergeben) :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 11. Mai 2008, 23:18

Hallo pudeldestodes!

Du kannst die Parameter auch dynamsch übernehmen.

Code: Alles auswählen

def doLogin(self, *args, **kwargs):
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Sonntag 11. Mai 2008, 23:24

Vielen Dank Gerold!

Aber Mist, da hab ich mich vom Tutorial in die Irre leiten lassen,
Both arguments have to be declared as keyword arguments.
so dass ich das gar nicht erst ausprobiert habe :oops:
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Montag 12. Mai 2008, 10:23

Ist nicht aber explizit besser als implizit? Wäre es nicht einfacher, die 16 Variablen als Schlüsselwortparameter zu definieren, als dann in der Methode mit params['foo'] und params['bar'] zu hantieren? Oder kann man die auf natürliche Weise indizieren und dann am Stück verarbeiten?

Stefan
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 12. Mai 2008, 10:47

sma hat geschrieben:Wäre es nicht einfacher, die 16 Variablen als Schlüsselwortparameter zu definieren, als dann in der Methode mit params['foo'] und params['bar'] zu hantieren?
Hallo Stefan!

Dann möchte ich auch noch dazu schreiben, dass ich die Parameter ebenfalls lieber im Funktionskopf benenne als diese später aus dem Dictionary (kwargs) raus zu picken. Aber wenn jemand danach fragt, sollte man nicht verschweigen, dass es auch andere Möglichkeiten gibt. Und im Endeffekt kommt es mehr auf die Neigung des Programmierers an, ob im Funktionskopf oder in einem Dictionary.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Montag 12. Mai 2008, 11:06

Jeweils 4 der Felder gehören thematisch zusammen, demnach sind die zum Beispiel math1 - math4 benannt.

Und dann mache ich jetzt so etwas:

Code: Alles auswählen

mathematics_mean = compute_mean([kwargs[arg] for arg in kwargs if 'math' in arg])
Aber schreibt ihr das denn dann bei großem Funktionskopf wirklich mit der 80-Zeichenkonvention oder sieht man da dann mal drüber hinweg um das in 2,3 Zeilen zu kriegen?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 12. Mai 2008, 12:09

pudeldestodes hat geschrieben:Aber schreibt ihr das denn dann bei großem Funktionskopf wirklich mit der 80-Zeichenkonvention oder sieht man da dann mal drüber hinweg um das in 2,3 Zeilen zu kriegen?
Hallo pudeldestodes!

Ohne viele Worte. Einfach mal ausprobieren:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import cherrypy
from textwrap import dedent
from Cheetah.Template import Template


class Root(object):
    
    def index(self):
        # HTML gehört normalerweise in eine eigene Vorlagendatei ausgelagert.
        # Hier handelt es sich nur um ein Beispiel!
        template_string = dedent("""
        <?xml version="1.0"?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html>
        <head>
          <meta http-equiv="content-type" content="text/html; charset=iso-8859-15" />
          <title>Formulartest</title>
        </head>
        <body>
          
          <form action="register_data" method="POST">
            Vorname: <input type="text" name="vorname" /><br />
            Nachname: <input type="text" name="nachname" /><br />
            Email 1: <input type="text" name="email_addresses" /><br />
            Email 2: <input type="text" name="email_addresses" /><br />
            Email 3: <input type="text" name="email_addresses" /><br />
            Email 4: <input type="text" name="email_addresses" /><br />
            Telefonnummer 1: <input type="text" name="phone_numbers" /><br />
            Telefonnummer 2: <input type="text" name="phone_numbers" /><br />
            Telefonnummer 3: <input type="text" name="phone_numbers" /><br />
            Telefonnummer 4: <input type="text" name="phone_numbers" /><br />
            <input type="submit">
          </form>
        
        </body>
        </html>        
        """).strip()
        template = Template(template_string)
        
        return str(template)
    
    index.exposed = True
    
    
    def register_data(
        self, vorname = None, nachname = None, strasse = None, plz = None,
        ort = None, email_addresses = [], phone_numbers = [] 
    ): 
        cherrypy.response.headers["Content-Type"] = "text/plain"
        
        # Vorlagen gehören normalerweise in eigene Vorlagendateien ausgelagert.
        # Hier handelt es sich nur um ein Beispiel!
        template_string = dedent("""
        Vorname: $vorname
        Nachname: $nachname
        Strasse: $strasse
        PLZ: $plz
        Ort: $ort
        #for ($index, $email) in enumerate($email_addresses)
        #set $index = $index + 1
        #if $email
        Emailadresse $index: $email
        #end if
        #end for
        #for ($index, $phone) in enumerate($phone_numbers)
        #set $index = $index + 1
        #if $phone
        Telefonnummer $index: $phone
        #end if
        #end for
        """).lstrip()
        template = Template(template_string, searchList = locals())
        
        return str(template)
    
    register_data.exposed = True


def main():
    cherrypy.quickstart(Root())


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Montag 12. Mai 2008, 13:15

Ah, mir geht ein Licht auf - danke! ;)
Antworten