bottle+wtforms - Integer Problem

Django, Flask, Bottle, WSGI, CGI…
Antworten
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Auf der Konsole funktioniert folgendes problemlos:

Code: Alles auswählen

from wtforms import Form, StringField, IntegerField, SubmitField, validators

class BizhubForm(Form):
    project_name = StringField(u'project_name', [validators.required(), validators.length(max=15)])
    project_id = IntegerField(u'project_id', [validators.required(), validators.length(max=4)])
    submit = SubmitField(u'submit')

form = BizhubForm(project_name=u'Hallo Welt', project_id=u'1234')

print form.validate()
print form.errors
In der Bottle app mit derselben Klasse:

Code: Alles auswählen

@app.route('/bizhub', method='GET')
def bizhub(db):
    username = is_logged_in(db)
    form = BizhubForm(request.GET.decode())
    if request.GET.get('save'):
        for i in form:
            print i
        print form.errors
        print form.validate()
Kommt folgender Fehler:

Code: Alles auswählen

<input id="project_name" name="project_name" type="text" value="Hallo Welt">
<input id="project_id" name="project_id" type="text" value="1234">
<input id="submit" name="submit" type="submit" value="submit">
{}
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\bottle.py", line 862, in _handle
    return route.call(**args)
  File "C:\Python27\lib\site-packages\bottle.py", line 1732, in wrapper
    rv = callback(*a, **ka)
  File "C:\Python27\lib\site-packages\bottle_sqlite.py", line 100, in wrapper
    rv = callback(*args, **kwargs)
  File "app.py", line 126, in bizhub
    print form.validate()
  File "C:\Python27\lib\site-packages\wtforms\form.py", line 310, in validate
    return super(Form, self).validate(extra)
  File "C:\Python27\lib\site-packages\wtforms\form.py", line 152, in validate
    if not field.validate(self, extra):
  File "C:\Python27\lib\site-packages\wtforms\fields\core.py", line 200, in validate
    stop_validation = self._run_validation_chain(form, chain)
  File "C:\Python27\lib\site-packages\wtforms\fields\core.py", line 220, in _run_validation_chain
    validator(form, self)
  File "C:\Python27\lib\site-packages\wtforms\validators.py", line 92, in __call__
    l = field.data and len(field.data) or 0
TypeError: object of type 'int' has no len()
[/size]
Leider weiss ich jetzt nicht, ob mir da bottle den String verhunzt oder wo genau das Problem liegt mit ``project_id``
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

http://wtforms.simplecodes.com/docs/1.0.2/fields.html#wtforms.fields.IntegerField hat geschrieben:class wtforms.fields.IntegerField(default field arguments)

A text field, except all input is coerced to an integer. Erroneous input is ignored and will not be accepted as a value.
Ausgehend von der Fehlermeldung und der Dokumentation wuerde ich sagen, dass dein (funktionierender) Testcode falsch ist und du einen anderen Validator brauchst..
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Ja, hab gerade auch bemerkt, dass der Testcode falsch ist. Denn hier kann auch ein String benutzt werden. Ich werde nochmals in der Doku nachlesen.

Danke

Edit:

Code: Alles auswählen

project_id = IntegerField(u'project_id', [validators.required(), validators.NumberRange(min=1, max=9999)])
Antworten