使用oauthlib对UTF8内容进行签名时请谨慎

这不是oauthlib第一次表现对Unicode内容的轻薄了。

如果不想用这种侵入性的修改方案,可以使用我的另外一种方法:

def urldecode(params):
    if isinstance(params, unicode):
        params = params.encode("utf8")
    return oauthlib.common.decode_params_utf8(urlparse.parse_qsl(params, keep_blank_values=True))

oauthlib.common.urldecode = urldecode

当然这个方法的牺牲是,对非法十六进制字符的检测没有了,当然你可以照着oauthlib的方法再加进去

其实这个问题的本质是urlparse.parse_qsl函数的问题,没有针对unicode_string做检测,而是按照iterable object的方式产生u’\xe5\x95\xa6\xe5\x95\xa6'这样的畸形unicode字符串……

Update: 这个问题现在已经被解决了。