I cannot reproduce the error but this may be a browser issue again and
the way it handles the "email=...@s.com" in the URL below. @ should be
encoded as it is not allowed in URL.

http://127.0.0.1:8000/my_app/input_data/form2?admin=False&email=...@s.com&name=j&profile=something&sure=yes

On May 29, 1:01 pm, Dan <danbr...@gmail.com> wrote:
> Thanks Massimo- I'm starting to understand the http flow better now...
>
> but the code you sent returned the same error I was seeing in my code
> when I clicked on the submit button on the form. Here are the snippets
> from the traceback:
> ...
>     if form.accepts(request.vars,session):
> ...
>   File ".../web2py/gluon/validators.py", line 70, in __call__
>     match = self.regex.match(value)
> TypeError: expected string or buffer
>
> The URL I used was this:
> http://127.0.0.1:8000/my_app/input_data/form2?admin=False&email=...@s.com&name=j&profile=something&sure=yes
>
> And the controller code is this:
>
> def form2():
>     hidden = dict([(k,v) for (k,v) in request.get_vars.items() if not
> k in ['name','email','sure']])
>     form=FORM(TABLE(TR("Your name:",INPUT
> (_type="text",_name="name",_value=request.vars.name or '',
>                                           requires=IS_NOT_EMPTY())),
>                     TR("Your email:",INPUT
> (_type="text",_name="email",_value=request.vars.email or '',
>                                           requires=IS_EMAIL())),
>                     TR("Admin",INPUT(_type="checkbox",_name="admin")),
>                     TR("Sure?",SELECT
> ('yes','no',_name="sure",requires=IS_IN_SET(['yes','no']))),
>                     TR("Profile",TEXTAREA(_name="profile",value="write
> something here")),
>                     TR("",INPUT(_type="submit",_value="SUBMIT"))),
>              hidden=hidden, action='POST', method=URL(r=request))
>     if form.accepts(request.vars,session):
>           form.vars.update(hidden)
> #          response.flash="form accepted"
>     else:
>           pass
>     return dict
> (form=form,form_vars=form.vars,request_vars=request.vars)
>
> On May 29, 10:00 am, mdipierro <mdipie...@cs.depaul.edu> wrote:
>
> > You want:
> >     ## receive info using URL params, and show the form
> >     ## receive info using form when URL params present
> >     ## show empty form when no URL params present
> >     ## receive info using form when no URL params present
> > Do not do it this way because your point 2 is outsite the http specs
> > and different browsers will behave in different ways.
> > Some will discard the variables in the URL, some will not, some may
> > duplicate the values. This is not a web2py issue. This is a browser
> > issue. There is no standard.
>
> > You should do
>
> > def form():
> >     hidden = dict([(k,v) for (k,v) in request.get_vars.items() if not
> > k in ['name','email','sure']]
> >     form=FORM(TABLE(TR("Your name:",INPUT
> > (_type="text",_name="name",_value=request.vars.name or '',
> > requires=IS_NOT_EMPTY())),
> >                     TR("Your email:",INPUT
> > (_type="text",_name="email",_value=request.vars.email or
> > '',requires=IS_EMAIL())),
> >                     TR("Admin",INPUT(_type="checkbox",_name="admin")),
> >                     TR("Sure?",SELECT
> > ('yes','no',_name="sure",requires=IS_IN_SET(['yes','no']))),
> >                     TR("Profile",TEXTAREA(_name="profile",value="write
> > something here")),
> >                     TR("",INPUT(_type="submit",_value="SUBMIT"))),
> >              hidden=hidden, action='POST', method=URL(r=request))
> >     if form.accepts(request.vars,session):
> >           form.vars.update(hidden)
> >     else:
> >           pass
>
> > On May 29, 11:32 am, Dan <danbr...@gmail.com> wrote:
>
> > > > 2) you are using
>
> > > >   form.accepts(request.vars,session):
>
> > > > Which is desigend to prevent double submissions and various types of
> > > > attacks by hiding hidden one time tokens in the form and preventing
> > > > validation if the form if the token is not returned.
> > > > You can disable this by using
>
> > > >   form.accepts(request.vars,formname=None):
>
> > > > and the request.vars.name will be copied in form.vars.name
>
> > > Thanks for that suggestion, it helped a bit.
>
> > > Sorry, I wasn't clear in my earlier message: I sent my code, and in
> > > addition to that I sent the URL to call one of the sample apps in the
> > > web2py documentation which showed the same symptoms.
>
> > > Here is a self-contained example, with 3 different options for calling
> > > the "form.accepts()" method, each having slightly different problems/
> > > symptoms - I need to get one of them working (or some other approach).
> > > The controller needs to be able to acecpt information from 2 different
> > > sources: either using parameters in the URL, or using a form on the
> > > web page. If the user starts out sending information using URL
> > > parameters, they should be able to use the form to send a subsequent
> > > set of information.
> > > That means the controller needs to do these 4 things:
> > >     ## receive info using URL params, and show the form
> > >     ## receive info using form when URL params present
> > >     ## show empty form when no URL params present
> > >     ## receive info using form when no URL params present
>
> > > The URL with parameters that I'm using is this:
> > > http://127.0.0.1:8000/my_app/input_data/form?admin=False&emai...@s.com&name=j&profile=something&sure=yes
> > > and the URL without any parameters is of course 
> > > this:http://127.0.0.1:8000/my_app/input_data/form
>
> > > here is the code in the controller called input_data.py, mostly
> > > following the documentation's example 28 (http://www.web2py.com/
> > > examples/default/examples):
>
> > > def form():
> > >     form=FORM(TABLE(TR("Your name:",INPUT
> > > (_type="text",_name="name",requires=IS_NOT_EMPTY())),
> > >                     TR("Your email:",INPUT
> > > (_type="text",_name="email",requires=IS_EMAIL())),
> > >                     TR("Admin",INPUT(_type="checkbox",_name="admin")),
> > >                     TR("Sure?",SELECT
> > > ('yes','no',_name="sure",requires=IS_IN_SET(['yes','no']))),
> > >                     TR("Profile",TEXTAREA(_name="profile",value="write
> > > something here")),
> > >                     TR("",INPUT(_type="submit",_value="SUBMIT"))))
>
> > >     ### VALIDATION 1 (disabled)
> > > #    if form.accepts(request.vars,session):
> > >     ## receive info using URL params and show form: PROBLEM.
> > > information appears to be received but not processed. it says "please
> > > fill in the form" and the request variables are displayed (but not
> > > form variables).
> > >     ## receive info using form when URL params present: ERROR. ("if
> > > form.accepts(request.vars,session):" leads to error "TypeError:
> > > expected string or buffer" from validators.py)
> > >     ## show empty form when no URL params present: OK
> > >     ## receive info using form when no URL params present: OK
>
> > >     ### VALIDATION 2 (enabled)
> > >     if form.accepts(request.vars,formname=None):
> > >     ## receive info using URL params and show form: OK
> > >     ## receive info using form when URL params present: ERROR. ("if
> > > form.accepts(request.vars,formname=None):" leads to error "TypeError:
> > > expected string or buffer" from validators.py)
> > >     ## show empty form when no URL params present: PROBLEM. shows user
> > > a "form is invalid" message
> > >     ## receive info using form when no URL params present: OK
>
> > >     ### VALIDATION 3 (disabled)
> > > #    if form.accepts(request.vars):
> > >     ## receive info using URL params and show form: PROBLEM.
> > > information appears to be received but not processed. it says "please
> > > fill in the form" and the request variables are displayed (but not
> > > form variables).
> > >     ## receive info using form when URL params present: ERROR. ("if
> > > form.accepts(request.vars):" leads to error "TypeError: expected
> > > string or buffer" from validators.py)
> > >     ## show empty form when no URL params present: OK
> > >     ## receive info using form when no URL params present: OK
>
> > >         response.flash="form accepted"
> > >     elif form.errors:
> > >         response.flash="form is invalid"
> > >     else:
> > >         response.flash="please fill the form"
> > >     return dict
> > > (form=form,form_vars=form.vars,request_vars=request.vars)
>
> > > So the issues that I'm trying to understand and fix:
> > > 1) when trying to  receive info using form when URL params present,
> > > what does the error involving "expected string or buffer" mean? How
> > > can I fix that?
> > > 2) using validation method #2, how can I avoid showing the error
> > > message when the form is loaded without any parameters in the URL?
> > > 3) using validation method #1 or #3, why does the controllerappear to
> > > receive info from the URL but not act on it?
>
> > > Thanks
>
> > > Dan
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py Web Framework" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to