Python - 追加到QueryDict的开头 - 保持顺序转换为查询字符串

时间:2014-07-03 18:35:14

标签: python query-string urlencode urllib

我正在尝试添加到QueryDict的开头并维护项目的顺序(需要最终编码为具有特定顺序的查询字符串)。我知道querydict是不可变的,所以你必须首先使用.copy(),但似乎无法添加值。您可以通过我的日志告诉querydict不会改变。感谢您提供的任何提示 -

这是我的Python代码:

if self.request.POST:
    params = self.request.POST.copy()

logging.info('params response back: %s' % params)   

if params:
    params['cmd']='_notify-validate'  
    logging.info('just added cmd: %s' % params)             
    params = urllib.urlencode(params)
    logging.info('converted response back: %s' % params)

这是我的日志:

2014-07-03 10:58:36.460 params response back: UnicodeMultiDict([('residence_country', u'US'), ('invoice', u'abc1234'), ('address_city', u'San Jose'), ('first_name', u'John'),

2014-07-03 10:58:36.461 just added cmd: UnicodeMultiDict([('residence_country', u'US'), ('invoice', u'abc1234'), ('address_city', u'San Jose'), ('first_name', u'John'), ('pay

2014-07-03 10:58:36.462 converted response back: residence_country=US&invoice=abc1234&address_city=San+Jose&first_name=John&payer_id=TESTBUYERID01&mc_fee=0.44&txn_id=53760294

2 个答案:

答案 0 :(得分:2)

QueryDict继承自Django的MultiValueDict,它继承自Python的dict,它是作为哈希表实现的。因此,您无法保证它会保持有序。

但是您可以做的是仅将键添加到列表中以保留该顺序(同时最小化空间)。

答案 1 :(得分:0)

我认为您可以使用(名称,值)对元组来确保订单而不是dict(根据定义,它不能保证任何订单,实际上没有订单)

params = urllib.urlencode([("param1","val1"),("param2","val2"),...])

这将保证params的顺序