Bottle Formulare

Django, Flask, Bottle, WSGI, CGI…
BlackJack

@meego: Nee, ich denke gettext & Co sind nicht mal eben in zwei Sätzen erklärt. Das ist ja auch ein kompliziertes Thema. Die meisten Leute kennen ja nur zwei, drei Sprachen und haben keine Ahnung was es alles an Regeln und Ausnahmen in anderen Sprachen geben kann, zum Beispiel was Ein- und Mehrzahl angeht bzw. dass das bei einigen Sprachen gar keine binäre Sache ist, sondern das da noch mehr unterschieden wird.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

@BlackJack: Kurze Rede, langer Sinn: Du empfiehlst mir die Tabelle erst einmal auf id/deutscher Text zu beschränken und mich dann später um Sprachen zu kümmern..
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Wieso stellen ORMs eigentlich nicht selber Methoden für die Validationsprüfung zur Verfügung?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: Tun sie doch. Zudem kann man noch auf Datenbankebene constraints setzen, wenn sie unterstützt werden.
BlackJack

@meego: Zum einen weil ORMs nicht wissen wo die Daten herkommen und bei vielen ”Quellen” bereits Mechanismen zur Validierung bereitstehen und auf der anderen Seite auch auf der Seite der Datenbank über CONSTRAINT Prüfungen möglich sind, Spezielle (NOT NULL, UNIQUE, PRIMARY KEY) oder auch allgemein formulierbare mit CHECK.

Ausserdem bietet SQLAlchemy beispielsweise durchaus die Möglichkeit über den `sqlalchemy.orm.validates()`-Dekorator Methoden zur Validierung von Attributwerten zu schreiben.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
meego hat geschrieben:Wieso stellen ORMs eigentlich nicht selber Methoden für die Validationsprüfung zur Verfügung?
In WTForms zu validieren hat außerdem den Vorteil, dass WTForms bei Fehlern in der Validierung direkt ein neues Formular inkl. Fehlerausgabe generien kann - das kann ein ORM halt nicht, weil's eine Ebene tiefer sitzt.
meego hat geschrieben:Kurze Rede, langer Sinn: Du empfiehlst mir die Tabelle erst einmal auf id/deutscher Text zu beschränken und mich dann später um Sprachen zu kümmern..
Alsp ich würde das ganze schon mal an einer Mini-Applikation (muss ja nicht unbedingt dein Immobilien-Projekt sein) üben, damit du siehst, wie das funktioniert. Außerdem könnte es ja auch sein, dass du damit überhaupt nicht klar kommst, was wiederum einfluss auf den Entwurf den Applikation / Datenbank haben könnten.

Und der Vollständigkeit halber sei noch angemerkt, dass Django i18n ootb unterstützt.

Gruß, noisefloor
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

noisefloor hat geschrieben:Und der Vollständigkeit halber sei noch angemerkt, dass Django i18n ootb unterstützt.
Übersetzung: Wenn du Django benutzen würdest, wie seit Wochen empfohlen, müsstest du auch das Rad "Verwaltung übersetzter Texte" nicht neu erfinden.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Gibt auch ein paar django apps: https://www.djangopackages.com/grids/g/i18n/

i18n ist halt auch ein komplexes Thema...

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

Hallo
In WTForms zu validieren hat außerdem den Vorteil, dass WTForms bei Fehlern in der Validierung direkt ein neues Formular inkl. Fehlerausgabe generien kann - das kann ein ORM halt nicht, weil's eine Ebene tiefer sitzt.
Es könnte diese Methoden vielleicht auch implementieren und selber die Formularfelder erzeugen..
Übersetzung: Wenn du Django benutzen würdest, wie seit Wochen empfohlen, müsstest du auch das Rad "Verwaltung übersetzter Texte" nicht neu erfinden.
Will ich auch nicht. Und dafür müsste ich dann vermutlich erst einmal ein halbes Jahr lang das wesentlich unintuitivere Django erlernen, um überhaupt etwas damit anstellen zu können.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
meego hat geschrieben:Es könnte diese Methoden vielleicht auch implementieren und selber die Formularfelder erzeugen..
Äh... heißt was genau? Verstehe ich gerade nicht.

EDIT: bezieht das "Es" auf das ORM?

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hi
noisefloor hat geschrieben:
meego hat geschrieben: EDIT: bezieht das "Es" auf das ORM?
Gruß, noisefloor
Ja, soweit ich den WTF-Crashkurs bis jetzt verstanden habe, erzeugt man damit ja dann auch über Widget irgendwelche Felder fürs Template.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Was heisst das? Ist direkt aus dem WTF-Crashkurs übernommen:

Code: Alles auswählen

housetype = IntegerField('Art des Hauses', [validators.NumberRange(min=1, max=30, message=_(u'Bitte wähle ein Haus aus.'))])
NameError: name '_' is not defined
BlackJack

@meego: Das ist schon wieder so eine absolute Grundlage, die wir zudem auch schon mal hatten: Wenn man einen Namen verwendet, dann muss der vorher irgendwo definiert werden. Das ist auch beim Namen `_` nicht anders. Offenbar benutzen die das im „Crash Course“ ohne es vorher irgendwo einzuführen. Das ist konventionell ein Name unter den man `gettext.gettext()` importiert.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@meego: ein ORM is halt ein ORM und kein Formular-Framework. Genau soc wie z.B. WTForm nichts in eine Datenbank schreibt. Oder anders: für jeden Job das passende Tool.
Ja, soweit ich den WTF-Crashkurs bis jetzt verstanden habe, erzeugt man damit ja dann auch über Widget irgendwelche Felder fürs Template.
Genau. Du definierst auf dem pythonischen Weg Klasse, aus denen du später im Template die Formularfelder renderst. Der eigentliche Vorteile ist aber die Validierung und das du dich später nicht mit dem HTML und dem extrahieren der Formulardaten aus den POST-Daten rumschlagen musst.

Der Vollständigkeit halber sei noch gesagt, dass:
* es für WTForms eine Extension gibt, die das SQLAlchemy-Modellen Formulare generieren kann
* Django kann aus Modellen seinem ORM auch Formulare generieren, und zwar mit 4 kurzen Zeilen Code :-)

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

BlackJack hat geschrieben:@meego: Das ist schon wieder so eine absolute Grundlage, die wir zudem auch schon mal hatten: Wenn man einen Namen verwendet, dann muss der vorher irgendwo definiert werden. Das ist auch beim Namen `_` nicht anders. Offenbar benutzen die das im „Crash Course“ ohne es vorher irgendwo einzuführen. Das ist konventionell ein Name unter den man `gettext.gettext()` importiert.
Was ist gettext? Und wie lautet der im Tutorial vermisste Import-Befehl konkret?
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo noisefloor
noisefloor hat geschrieben:.. und dem extrahieren der Formulardaten aus den POST-Daten rumschlagen musst.
Ist das nicht auch extrahieren:

Code: Alles auswählen

def register(request):
    form = RegistrationForm(request.POST)
    if request.method == 'POST' and form.validate():
        user = User()
        user.username = form.username.data
        user.email = form.email.data
        user.save()
        redirect('register')
    return render_response('register.html', form=form)
Muss man bei Bottle das Objekt request eigentlich auch so der Funktion unter der Route übergeben? Bis jetzt war das nicht nötig. Bis jetzt musste ich über request.forms.GET die Formulardaten abrufen.
* es für WTForms eine Extension gibt, die das SQLAlchemy-Modellen Formulare generieren kann
* Django kann aus Modellen seinem ORM auch Formulare generieren, und zwar mit 4 kurzen Zeilen Code :-)
Und wenn man dann nicht alle Felder der Tabelle füllt?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich glaube django wäre besser für dich, weil in der Dokumentation viele fragen schon geklärt werden...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@meego: `gettext` ist ein Modul in der Standardbibliothek. Den konkreten Import kann ich Dir nicht sagen, weil das davon abhängt wie man `gettext` verwenden will. Man kann die Funktion `gettext()` (oder eine der Variationen davon) an den Namen binden, oder man kann ein „translation“-Objekt erstellen und dessen `gettext()`-Methode (oder eine der Variationen davon) an den Namen binden, oder — und das ist bei Webanwendungen wahrscheinlich vorzuziehen — man verwendet dessen `ugettext()`-Methode (oder eine der Variationen davon). Man kann aber auch mit der `install()`-Methode eine der `*gettext()`-Methoden wirklich global installieren.

Es kann aber auch sein das man `gettext` gar nicht direkt verwenden will sondern eine weitere Bibliothek dazwischen schaltet und dessen `gettext()`-Äquivalent verwenden möchte.

Dazu muss man sich mal mit diesem ganzen Thema auseinandersetzen, und das wird Zeit beanspruchen. Sowohl was das einlesen in i18n mit Gettext & Co allgemein betrifft, also abseits von Python, denn dieses System wird ja auch bei anderen Programmiersprachen eingesetzt, als auch konkret mal mit dem entsprechenden Python-Modul(en). Und natürlich müsste man sich in die Werkzeuge einarbeiten die es zum Bearbeiten der Übersetzungen gibt. So ein paar Tage nur für dieses Thema sollte man schon einplanen.

Bei Deinem `User`-Beispiel sind das ja beides Textfelder, das wäre auch ohne WTForms nicht so viel mehr Arbeit. Aber bei anderen Feldarten käme noch die Konvertierung in den entsprechenden Datentyp, und natürlich die Validierung hinzu. Bei der E-Mail-Adresse könnte man beispielsweise prüfen ob da überhaupt etwas drin steht, und mindestens ob ein '@' enthalten ist.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Muss man bei Bottle das Objekt request eigentlich auch so der Funktion unter der Route übergeben?
Nein, das funktioniert so nicht unter Bottle. Wie in der WTForms Doku steht, sind die meisten Beispiele Pseudo-Code, der an die Syntax von Django angelehnt ist.

Am besten suchst du dir mal ein paar Webseiten die erklären, wie du die POST / Formular-Daten unter Bottle an WTForms übergibst.
Ich glaube django wäre besser für dich, weil in der Dokumentation viele fragen schon geklärt werden...
Zumal bei Django das Zusammenspiel von ORM, Templates und Formularframework klar ist - da muss man sich halt nicht wie bei Bottle + PeeWee + WTForms um's zusammenspiel kümmern. Bei ich ja wie gesagt auch eine "alte" Applikation mit Bottle + WTForms + SQLAlchemy habe - das ist auch kein Hexenwerk. Aber es ist mit Django IMHO einfacher und schneller.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

BlackJack hat geschrieben:@meego: `gettext` ist ein Modul in der Standardbibliothek. Den konkreten Import kann ich Dir nicht sagen, weil das davon abhängt wie man `gettext` verwenden will. Man kann die Funktion `gettext()` (oder eine der Variationen davon) an den Namen binden, oder man kann ein „translation“-Objekt erstellen und dessen `gettext()`-Methode (oder eine der Variationen davon) an den Namen binden, oder — und das ist bei Webanwendungen wahrscheinlich vorzuziehen — man verwendet dessen `ugettext()`-Methode (oder eine der Variationen davon). Man kann aber auch mit der `install()`-Methode eine der `*gettext()`-Methoden wirklich global installieren.


Klingt kompliziert. Ist Babel eine Konkurrenz zu gettext? Ich könnte den Unterstrich vielleicht auch erst einmal weglassen?
Antworten