LoginSignup
1
2

More than 5 years have passed since last update.

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

Posted at

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 は配列の形で転送されました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2