[Zope] build a query string out of a dictionary (REQUEST.form)

Grégoire Weber gregoire.weber@switzerland.org
Thu, 12 Jul 2001 18:18:08 +0200


Hi Andy,
Hallo Dieter,

Thanks a lot for your prompt answers! It gave me
the good feeling about having support from competent 
people!

As I supposed there did not exist a clean solution 
(I don't like extrenal python methods -- Sorry Andy!)
for that problem. It's even not in builtin in Zope :-(

So I programmed my first hotfix product which adds the
method 'query_string' to the HTTPRequest class.

Have a look at: 
   http://www.zope.org/Members/gregweb/HTTPRequestHotfix

What do you think? Should I file this to the tracker?

Greg

------------------------------------------------------------------------
HTTPRequestHotix Product

  This so called 'Hotfix' adds the new method 'query_string' to the
  HTTPRequest class. The method is then accessible through the
  'REQUEST' object.

  It builds a url quoted (quote_plus) query string from a dictionary
  (usually from the form dictionary which is based on QUERY_STRING).

  Usage

    query_string([[replace]=replace_dict], [[original]=original_dict]])

    Updates 'original_dict' by the values in 'replace_dict' and
    returns the result as url quoted query string.

    'original_dict' defaults to 'REQUEST.form' if no parameter
    is passed to it. Keys in 'replace_dict' with a value of
    'None' (or _.None in DTML) will be deleted from 'original_dicts'
    before being quoted.

    The original 'REQUEST.form' will remain unchanged.

  Examples

    (assuming 'REQUEST.form' is {'foobar':'no translation', 'foo':'bar'})

    1. query_string(replace={'foobar':'furchtbar in german'})
       returns 'foobar=furchtbar+in+german&foo=bar'

    2. query_string(replace={'gaga':'&%+'}, original={'bar', 'foo'})
       returns 'gaga=26%25%2b&bar=foo'

    3. query_string(replace={'bar':'foo', 'foo', _.None})
       returns 'foobar=no+translation&bar=foo'

    4. The same in DTML:
       <dtml-var "REQUEST.query_string(replace={'bar':'foo', 'foo', _.None})">
       returns 'foobar=no+translation&bar=foo'

  Have fun!

  Grégoire Weber, 2001-07-12


At 08:10 11.07.01 -0700, Andy McKay wrote:
> A simple python method that loops through the form 
> doesnt need urllib.
> 
> eg:
> 
> for k, v in context.REQUEST.form.items():
>     if k == 'foo':
>         # do something
>     else:
>         somestr = '%s&%s=%s' % (somestr, k, v)

At 20:46 11.07.01 +0200, Dieter Maurer wrote:
> Andy McKay writes:
>  > for k, v in context.REQUEST.form.items():
>  >     if k == 'foo':
>  >         # do something
>  >     else:
>  >         somestr = '%s&%s=%s' % (somestr, k, v)
> Do not forget quoting:
>   
>     Query string fragments must be "urllib.quote_plus"ed.

_____________________________________
Grégoire Weber
mailto:gregoire.weber@switzerland.org