I apologize I missed this line. I am sorry this is not possible. If a variable appears twice, the correct thing to to is to have a list in request.vars. If we were to elminate duplicates we could no longer detect the case when duplicates are intentional.
Probably in your case the duplicate is due to the fact that the same value is in both request.get_vars and in request.post_vars and you want to choose one or the other. This was indeed a change of behavior in web2py and the previous behavior was considered a bug because it caused loss of information. Anyway, thanks for bringing it up. Massimo On Dec 17, 11:34 am, NuclearDragon <nucleardragon...@gmail.com> wrote: > So, I am in the process of upgrading Web2py from version 1.67 to > 1.89.5. Ouch. One of the things I encountered is that request.vars > will now include a list of duplicate values, rather than a single > value (not a list) as it previously did. For example, our url includes > a _next variable. So does the form when posting, including the Cancel > action. So now I end up with a list of 2 duplicate values when I test > set redirurl = request.vars.get('_next'). Rather than change that > umpteen times in our app, I am proposing a change to the function > 'parse_get_post_vars' in main.py. > > def parse_get_post_vars(request, environ): > > # always parse variables in URL for GET, POST, PUT, DELETE, etc. > in get_vars > dget = cgi.parse_qsl(request.env.query_string, > keep_blank_values=1) > for (key, value) in dget: > if key in request.get_vars: > if isinstance(request.get_vars[key], list): > request.get_vars[key] += [value] > else: > request.get_vars[key] = [request.get_vars[key]] + > [value] > else: > request.get_vars[key] = value > request.vars[key] = request.get_vars[key] > > # parse POST variables on POST, PUT, BOTH only in post_vars > request.body = copystream_progress(request) ### stores request > body > if (request.body and request.env.request_method in ('POST', 'PUT', > 'BOTH')): > dpost = > cgi.FieldStorage(fp=request.body,environ=environ,keep_blank_values=1) > # The same detection used by FieldStorage to detect multipart > POSTs > is_multipart = dpost.type[:10] == 'multipart/' > request.body.seek(0) > isle25 = sys.version_info[1] <= 5 > > def listify(a): > return (not isinstance(a,list) and [a]) or a > try: > keys = sorted(dpost) > except TypeError: > keys = [] > for key in keys: > dpk = dpost[key] > # if en element is not a file replace it with its value > else leave it alone > if isinstance(dpk, list): > if not dpk[0].filename: > value = [x.value for x in dpk] > else: > value = [x for x in dpk] > elif not dpk.filename: > value = dpk.value > else: > value = dpk > pvalue = listify(value) > if key in request.vars: > gvalue = listify(request.vars[key]) > if isle25: > value = pvalue + gvalue > elif is_multipart: > pvalue = pvalue[len(gvalue):] > else: > pvalue = pvalue[:-len(gvalue)] > request.vars[key] = value > if len(pvalue): > request.post_vars[key] = (len(pvalue)>1 and pvalue) or > pvalue[0] > ### Begin added code > for k,v in request.vars.iteritems(): > if isinstance(v, list) and len(v)==2: > request.vars[k] = v[0] if v[0] == v[1] else v > ### End added code > > Thoughts? Comments? Any reason I shouldn't make this change?