Hi, Ian. Thanks for reply.

>If you want to be EXTRA strict then you could try ConfirmType and 
>UnicodeString combined in an All validator to catch this error. Or something 
>to that effect.

This solution will work, but I wouldn't like to use it for several
reasons. First of all, we already have a huge code base that
intensively uses UnicodeStrings.  Surely, we could define our own
UnicodeString validator like below,

UnicodeString =
formencode.All(formencode.ConfirmType(subclass=unicode),
formencode.UnicodeString())

but we trying to keep our design clean.  Moreover, "All" and
"ConfirmType" require extra validation steps (and hence more function
calls). I think it has to be solved in more generic and concise way
(i.e. in formencode's internal api level).

> Also note that someone could actually send ?username=[u'John', u'Mike'] in
> the query which would exhibit similar behavior.

Yes, and it is the place where the inconsistency of validators
behaviour comes. if we'd have an unified behaviour for all single-
value validators (Int, UnicodeString, Bool etc.) we could get
"[u'John', u'Mike']" result only for "/?username=[u'John', u'Mike']"
request. But now, we can get the same result by the two different
requests - by "/?username=[u'John', u'Mike']" and by "/?
username=John&username=Mike". This shouldn't be allowed. And it's not
allowed for all single-value validators except the UnicodeString.

> If we don't use mixed then how do we get the multiple values when we want
> them?

We might explicitly specify our expectations with ForEach() and Set()
validators.
formencode's FancyValidator could internally test currently running
validator by calling something like

isinstance(current_validator, ForEach)

and then perform appropriate actions for this case (i.e. call single-
value validator for each found item with the same key).

P.S. I hope Ian Bicking will see this topic and give his opinion all
about this, as I might miss something important here.


On Feb 9, 6:38 am, Ian Wilson <[email protected]> wrote:
> Hi,
>
> I think this behavior happens because mixed is used 
> herehttps://bitbucket.org/ianb/formencode/src/d95237b33f3c/formencode/api....
> If you don't want that to happen ever then I think you need to cast params
> to a regular dictionary, with something like dict(request.params.items()).
> This will silently ignore one of the names though which might be worse.
>
> If you want to be EXTRA strict then you could try ConfirmType and
> UnicodeString combined in an All validator to catch this error.  Or
> something to that effect.
>
> Also note that someone could actually send ?username=[u'John', u'Mike'] in
> the query which would exhibit similar behavior.  So as far as I can tell if
> that is a problem you'd need to validate it either way.
>
> I agree that this might be misleading but its a difficult problem to solve.
> If we don't use mixed then how do we get the multiple values when we want
> them?  I think formencode might just need better internal integration with
> multiple value dictionaries so that different types don't show up depending
> on the input.  It tries to be input agnostic though.
>
> -Ian
>
> On Tue, Feb 8, 2011 at 10:25 AM, Maxim Avanov <[email protected]>wrote:
>
>
>
>
>
> > Here's an example.
>
> > # =====================
> > from formencode import Schema, Invalid
> > from formencode.validators import UnicodeString, Int
> > from webob import Request
>
> > class StrictSchema(Schema):
> >    allow_extra_fields = False
>
> > class IntegerTestSchema(StrictSchema):
> >    testfield = Int(not_empty=True)
>
> > class StringTestSchema(StrictSchema):
> >    testfield = UnicodeString(not_empty=True)
>
> > # Testing.
> > # =====================
> > req = Request.blank('/?testfield=111')
> > print IntegerTestSchema.to_python(req.params)
>
> > # This raises an exception
> > req = Request.blank('/?testfield=111&testfield=222')
> > try:
> >    IntegerTestSchema.to_python(req.params)
> > except Invalid as e:
> >    print "Caught Exception: {0}".format(e)
>
> > req = Request.blank('/?testfield=aaa')
> > print StringTestSchema.to_python(req.params)
>
> > # This will be passed successfully (!)
> > # The output will be {'testfield': u"[u'aaa', u'bbb']"}
> > req = Request.blank('/?testfield=aaa&testfield=bbb')
> > print StringTestSchema.to_python(req.params)
>
> > # ========================
>
> > Please note we do not use formencode.ForEach() or formencode.Set()
> > here. I think this is very unclear behaviour.
> > Imagine an UsernameValidator (or something related to "not-so-strict-
> > string-validator"). Instead of indicating an input error, we show the
> > service realization details to our users -- "{'username': u"[u'John',
> > u'Mike']"}" - "Ok. This is Python list inside the dict".
>
> > According to WebOb documentation (http://pythonpaste.org/webob/
> > #multidict), we probably should use request.GET.getone() instead of
> > request.GET.getall().
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "pylons-discuss" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected].
> > For more options, visit this group at
> >http://groups.google.com/group/pylons-discuss?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en.

Reply via email to