Bottle Formulare

Django, Flask, Bottle, WSGI, CGI…
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Warum funktioniert folgender Code nicht?

Code: Alles auswählen

@post('/erfassen')
def erfassen():
	roomtitle = request.forms.get('roomtitle')
	street = request.forms.get('street')
	return '<p>Wohungstitel: %s, Strasse: %s</p>' % roomtitle, street

Code: Alles auswählen

return '<p>Wohungstitel: %s, Strasse: %s</p>' % roomtitle, street
TypeError: not enough arguments for format string
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hat ja nichts mit bottle zu tun...
Otherwise, values must be a tuple with exactly the number of items...
https://docs.python.org/2/library/stdty ... operations
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Danke, wusste nicht, dass man für zwei Werte nur Tuples nehmen kann.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

für Formulare nimmt man am besten eine lib. Aus verschiedenen gründen. U.a. Sicherheit und wegen fehleranzeige für den user...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

WTForms? Was macht das konkret?

Ich möchte auch noch in einem Template eine Selektionsbox (die auf Tabellendaten zugreift) anzeigen. Ist es grundsätzlich richtig, wenn ich dazu eine Datenbankabfrage dem template als Dictionary übergebe?:

Code: Alles auswählen

@get('/art')
def art():
	result = SelectQuery(Housetype, Housetype.id, Housetype.housetype_de)
	dic = {}
   	for x in result:
   		dic.update({x.id : x.housetype_de})
	return template('unterkunft_art', dictionary=dic)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Egal welche lib man nimmt,sie sollte die Eingaben validieren. Z.b. das kein JS code oder SQL code drin ist.
Außerdem sollte sie Fehler dem user anzeigen. Z.b das eine Eingabe fehlt usw.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hmm. Der User sendet das Form ausgefüllt ab. Sollte das Feedback nicht beim Ausfüllen erfolgen?
BlackJack

@meego: Feedback beim ausfüllen ist okay, validieren auch, aber man muss auf jeden Fall auch auf dem Server validieren, denn es ist ja nicht garantiert das tatsächlich das Formular verwendet wurde. Von Benutzern kann unabsichtlich oder absichtlich *sonstwas* kommen.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hi Blackjack

Verstehe. Okay, ich versuche mich einmal einzulesen.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich habe für so was in der Tat immer WTForms verwendet. Das war für mich zumindest 2011, als ich mich zuletzt tiefer damit beschäftigt habe, 1. Wahl.

Gruß, noisefloor
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: Einzelne Einträge eines Wörterbuches setzt man nicht mit update sondern über den Indexzugriff mit eckigen Klammern. Normalerweise übergibt man der Template-Engine direkt das Query-Result, da direkt darüber iteriert werden kann.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo
noisefloor hat geschrieben: ich habe für so was in der Tat immer WTForms verwendet. Das war für mich zumindest 2011, als ich mich zuletzt tiefer damit beschäftigt habe, 1. Wahl.
Geht Bootstrap damit immer noch?
Sirius3 hat geschrieben:@meego: Einzelne Einträge eines Wörterbuches setzt man nicht mit update sondern über den Indexzugriff mit eckigen Klammern. Normalerweise übergibt man der Template-Engine direkt das Query-Result, da direkt darüber iteriert werden kann.
Warum nicht und wie meinst du genau?

Elegant. Was macht man dann, wenn man zwei Sprachspalten hat (bzw. macht man dann für jede Sprache eine eigene Route und Query)?
Eine Schwäche meiner Version mit id | spaltentext ist aber: Wenn die Nutzer eine id selektiert haben kann man die Reihenfolge der Buttons nicht mehr ändern, bzw. die Buttons erscheinen in der Reihenfolge der id.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
meego hat geschrieben:Hallo
Geht Bootstrap damit immer noch?
??? - was meinst du damit?
meego hat geschrieben:
Sirius3 hat geschrieben:@meego: Einzelne Einträge eines Wörterbuches setzt man nicht mit update sondern über den Indexzugriff mit eckigen Klammern. Normalerweise übergibt man der Template-Engine direkt das Query-Result, da direkt darüber iteriert werden kann.
Warum nicht und wie meinst du genau?
1. So:

Code: Alles auswählen

my_dict = {}
my_dict['foo'] = 'bar'
my_dict['spam'] = 'egg'
Also ohne `update`.

2. Dem Tempate kein Dict über geben, sondern direkt das Query-Result (was ja in der Regel eine Liste von Listen ist bzw. sich genau so verhält) und im Template darüber iterieren. Das generieren des Dict ist ein überflüssiger Schritt.

Gruß, noisefloor
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

meego hat geschrieben:Elegant. Was macht man dann, wenn man zwei Sprachspalten hat (bzw. macht man dann für jede Sprache eine eigene Route und Query)?
Eine Schwäche meiner Version mit id | spaltentext ist aber: Wenn die Nutzer eine id selektiert haben kann man die Reihenfolge der Buttons nicht mehr ändern, bzw. die Buttons erscheinen in der Reihenfolge der id.
Ich verstehe hiervon kein Wort? Was meinst Du mit Sprachspalten? Wo sind hier irgendwelche Buttons. Bitte mehr Kontext: Python-Code, Template, Datenbankdesign.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo

Die DB Tabelle Wohnungsoptionen ist in der Form:

Code: Alles auswählen

ID | Text_de | Text_en | Text_fr
Für das deutsche Template frage ich in der Query also die ID und den deutschen Text ab, welcher im Template via Iteration über das Queryresultat die Formularbuttons bildet. Das Formular spreichert dann die ID der Wohnungsoption in der Wohnungstabelle (ForeignKey).

Benötige ich nun für jede Sprache eine eigene Route, Query und Template?
BlackJack

@meego: Die Tabelle ist halt ungünstig aufgebaut. Die sollte eher (id, language, description) sein, mit `id` und `language` als zusammengesetzter Primärschlüssel, dann kann man ID und Sprache als Parameter bei der Suchanfrage verwenden. Andererseits würde ich so etwas nur machen wenn die Texte dort dynamisch über die Webseite eingegeben/erweitert werden. Falls es sich um Texte handelt die eher ”statisch” sind, gibt es ja schon andere, besser geeignete Vorgehen für i18n. Da würde ich mir mal das Babel-Package für Webanwendungen anschauen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: wie man mit unterschiedlichen Sprachen umgeht, gibt es verschiedene Möglichkeiten. Der Browser sendet im Header die gewünschte Sprache des Benutzers mit ('Accept-Language'). Natürlich kann man die Sprache auch in die URL kodieren, wobei hier natürlich nicht verschieden Routen definiert werden, sondern eine Route mit einem Language-Platzhalter. Dann kann man die Sprache noch in Cookies, Sessions, oder Query-Strings übermitteln.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

BlackJack hat geschrieben:@meego: Die Tabelle ist halt ungünstig aufgebaut. Die sollte eher (id, language, description) sein, mit `id` und `language` als zusammengesetzter Primärschlüssel, dann kann man ID und Sprache als Parameter bei der Suchanfrage verwenden. Andererseits würde ich so etwas nur machen wenn die Texte dort dynamisch über die Webseite eingegeben/erweitert werden. Falls es sich um Texte handelt die eher ”statisch” sind, gibt es ja schon andere, besser geeignete Vorgehen für i18n. Da würde ich mir mal das Babel-Package für Webanwendungen anschauen.
@BlackJack: Ich glaube dazu müsstest du schon ein Beispiel aufführen. Es hört sich nicht ganz einfach an. Babel sieht in der Doku eher nach kleineren Anpassungen aus (Datum/Währung).

@Sirius3: Sieht so aus, als ob ich das Problem erst einmal zurück stellen könnte. Vielleicht erst einmal mit einer Sprache anfangen.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo
meego hat geschrieben:Hallo
Geht Bootstrap damit immer noch?
??? - was meinst du damit?
Dies hier: Link.

Code: Alles auswählen

my_dict = {}
my_dict['foo'] = 'bar'
my_dict['spam'] = 'egg'
Hat das weniger Ressourcenverbrauch?

LG
BlackJack

@meego: Na Du hast halt nicht alle Sprachen zu einer ID in einem Datensatz sondern für jede ID und Sprache einen eigenen Datensatz.

Code: Alles auswählen

1 en House
1 de Haus
2 en Car
2 de Auto
Bei der Babeldokumentation hast Du dann wohl nicht gründlich genug gelesen.

Der Wörterbuchzugriff ist keine Frage des Ressoucenverbrauchs — obwohl die direkte Zuweisung eines Wertes natürlich etwas weniger Speicher und Rechenzeit benötigt als das erstellen eines neuen Wörterbuchs mit nur *einem* Schlüssel/Wert-Paar, nur um damit dann `update()` aufzurufen — sondern ob man unsinnigen, zu komplizierten Code schreibt, oder den genau für diesen Fall vorgesehenen.
Antworten