关于python 的url_encode关于的嵌套字典类型变量的编码扩展

当使用Python的urllib.url_encode处理包含嵌套字典的变量时,结果可能不符合HTTP请求的规范。本文介绍了一个重写的方法,能够正确处理嵌套字典类型的数据,将其转化为符合application/x-www-form-urlencoded格式的字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景

      在用python的类似httplib的HTTPConnection模拟http客户端发送application/x-www-form-urlencoded格式数据的时候,习惯使用

urllib的url_encode这个方法来转换字典类型值为key-value格式的字符串,但是这个方法的缺陷是对嵌套类型的字典变量执行的结果是不符合规范的:

     嵌套类型:

     {

         ‘key1’:[{'key2':'value2'}, {'key3':'value3'}],

         'key4':'value5'

     }

    url_encode之后,结果是不符合规范的


为了改进这种情况,需要对这个方法进行重写. 见如下:

from urllib import quote, quote_plus, _is_unicode
def urlencode(obj_data, result, p_index = None):
    if not isinstance(obj_data, dict) and p_index is None:
        return None
    # deal list type
    if isinstance(obj_data, list):
        for inner_v in obj_data:
            index_key = p_index
            if isinstance(inner_v, dict):
                # recursively call
                urlencode(inner_v, result, index_key)
            elif isinstance(inner_v, list):
                # recursively call
                urlencode(inner_v, result, '%s[]' % index_key)
            else:
                if _is_unicode(inner_v):
                    inner_v = inner_v.encode("ASCII","replace")
                result.append({p_index:inner_v})
    # deal dict type
    elif isinstance(obj_data, dict):
        for key, value in obj_data.items():
            if p_index is None:
                index_key = key
            else:
                index_key = '%s[%s]' %(p_index, key)
            if isinstance(value, dict):
                # recursively call
                urlencode(value, result, index_key)
            elif isinstance(value, list):
                # recursively call
                urlencode(value, result, '%s[]' % index_key)
            else:
                # deal string similarly value
                # encode transfer
                if _is_unicode(value):
                    value = value.encode("ASCII","replace")
                result.append({index_key:value})


# call example
def gen_urlforamt_data(obj_data):
    """
    format data to url string
    :obj_data dict type
    """
    result = list()
    urlencode(obj_data, result)
    url_elm = list()
    for one_elm in result:
        for key, value in one_elm.items():
            encode_elm = '%s=%s' % (quote_plus(key), quote_plus(str(value)))
            url_elm.append(encode_elm)
    return '&'.join(url_elm)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值