[Twisted-web] freeform and adbapi

Stephan Cieszynski darkblue.mail at gmx.net
Sat Apr 16 09:19:46 MDT 2005


Hello *.

I want to validate forminput against a database. For this reason, i 
wrote my own class:

class Username(annotate.Typed):
     def coerce (self, val, configurable):

         [some code]

         def _eb(r):
             raise annotate.InputError('database error')

     # this works very well:
         # def _cb(r, val):
         #    if len(r):
         #        return r[0][0]
         #    return ''

     # if the username already in use, i want to raise an exception:
     # the errormessage isn't placed correct in the rendered
         # 'form'page, but the whole exceptionpage is filled in
         # in the slot('error') of this input field
         def _cb(r, val):
             if len(r):
                 raise annotate.InputError("username in use")
             return val


         d = dbpool.runQuery("""SELECT username FROM userdb WHERE 
username = %s""", str(val))
         d.addCallback(_cb, val)
         d.addErrback(_eb)

         return d

dbpool.runQuery returns a deferred. If i want to use the username 
returned by the query, the result is placed correctly in the formfield.
But if an exception raised (here: InputError), the delay by the deferred 
is to long and the whole exceptionpage is placed in the slot('error'), 
not the message ('username in use') only.

Is my way right? Is there a way to solve this problem?

Stephan



More information about the Twisted-web mailing list