Django サービス B
が A
から受け取ったパラメータをなんの修正もしなくて、そのまま別サービス 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']
QueryDict
は dict()
メソードがありますが、想定と違い動きが出でいました。
>>> 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
は配列の形で転送されました。