POST method in Bottle

Django, Flask, Bottle, WSGI, CGI…
Antworten
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Hallo,

ich mache gerade meine ersten Gehversuche in Bottle und baue mir eine kleine Webanwendung. Am Anfang habe ich mit der GET-Methode gearbeitet, aber laut Doku soll man wohl lieber POST aus Sicherheitsaspekten nehmen.

Ich habe daher meinen bestehenden Code umgebaut und bin erst einmal darüber gestolpert, dass man wohl zwei identische Routen bauen muss, einmal mit und einmal ohne POST-Methode. Gibt es nur diesen Weg oder kann man das auch mit nur einer Route und nur einer Funktion machen?

Zweitens: Wie kann ich am Ende der zweiten Funktion zu einer Bestimmten route springen, z.B. @route('/admin/kursuebersicht')?

Code: Alles auswählen

@route('/admin/kurse/add')
def kurs_add():
    return template('template/kurs_add.tpl')


@route('/admin/kurse/add', method='POST')
def do_kurs_add():

    kursname = request.forms.getunicode('name')
    beschreibung = request.forms.getunicode('description')

    with sqlite3.connect(db_file) as con:
        cur = con.cursor()
        cur.execute("INSERT INTO kurse (kursname,beschreibung) VALUES (?,?)", (kursname,beschreibung))
        con.commit()
    # Springe hier zu einer anderen URL / route
BlackJack

@peddy: Wie in der Dokumentation zu route() steht, kann man bei `method` auch eine Liste übergeben. Wenn also für verschiedene Methoden die gleiche Funktion ausgeführt werden soll, muss man dafür nicht mehrere `route()`-Aufrufe verwenden.
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Hallo BlackJack,

da haben wir etwas aneinander vorbei geredet. Ich möchte gar nicht POST und GET parallel verwenden. Mich hat nur gewundert, dass bei GET ein Route-Eintrag reicht und bei POST wohl zwei benötigt werden:

Vorher:
@route('/admin/kurse/add', method='GET')
Nachher:
@route('/admin/kurse/add')
...
@route('/admin/kurse/add', method='POST')
Viel wichtiger ist mir jedoch zu erfahren, wie am Ende der Funktion do_kurs_add() zu einer anderen Seite weiter geleitet werden kann, ohne im Nirvana zu hängen.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei GET gibt es keine Unterscheidung, ob auf die URL über einen normalen Link oder über eine <form> verwiesen wurde. POST-Requests werden dagegen normalerweise nur durch <form>s ausgelöst.
peddy hat geschrieben:Viel wichtiger ist mir jedoch zu erfahren, wie am Ende der Funktion do_kurs_add() zu einer anderen Seite weiter geleitet werden kann, ohne im Nirvana zu hängen.
Du suchst redirect.
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Sirius3 hat geschrieben:Du suchst redirect.
Danke, jetzt geht es.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Mich hat nur gewundert, dass bei GET ein Route-Eintrag reicht und bei POST wohl zwei benötigt werden:
route ohne angehängtes "method" impliziert automatisch GET. Das steht auch irgendwo in der Doku von Bottle. Wenn du's expliziert magst kannst du ja auch explizit @get(...) und @post(...) verwenden. Link

Gruß, noisefloor
Antworten