Help us understand the problem. What is going on with this article?

django の QueryDict に配列パラメータ転送の話

More than 3 years have passed since last update.

Django サービス BA から受け取ったパラメータをなんの修正もしなくて、そのまま別サービス C に転送するプログラムを作ってます。

あるパターンで、もしそのパラメータは配列のであれば、配列全体ではなく、最後の要素のみサービスCに転送される不具合がありました。

修正前のソース:

>>> qd = QueryDict('egg=1&egg=2&p=3')
>>> response = requests.get('http://localhost:12345/', params=qd)

サービス C に請求先のURLは /?p=3\u0026egg=2 、が一つになりました。

調べたところ、QueryDict とPythonの dict は大きい違いがあります。 QueryDict をそのまま dict として渡されると、すべてのパラーメタは一つの値になります。中には QueryDict.get() メソードが使われるようです。

>>> qd.get('egg')
u'2'
>>> qd.getlist('egg')
[u'1', u'2']

QueryDictdict() メソードがありますが、想定と違い動きが出でいました。

>>> qd.dict()
{u'p': u'3', u'egg': u'2'}

最後に、この方法を見つかりました。

>>> dict(qd.iterlists())
{u'p': [u'3'], u'egg': [u'1', u'2']}

修正後のプログラムはこのように:

>>> response = requests.get('http://localhost:12345/', params=dict(qd.iterlists()))

今回にサービス C は正しく /?p=3\u0026egg=1\u0026egg=2 のように、egg は配列の形で転送されました。

liubin
Nothing to share
http://liubin.org
gamba
「笑顔ではたらく」をつくる gamba!
http://www.getgamba.com/top
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away