近期在项目中需要python requests发送uri中包含.%2e的请求,发现requests库会自动decode,谷歌百度没有很好的使用方法。也不想通过修改源码方式解决。
1.修改源码
涉及两处,requests涉及两处,自身一处,使用的urlib3一处
urlib3/util/url.py parse_url 函数中,对path和参数进行了encode,注释 
requests models.py 441行,对path进行了处理,注释

2.继承requests.Session
https://cloud.tencent.com/developer/article/1394648
3.patch
修改源码觉得不通用,不愿接受;继承session改动太大,所以决定patch方式
主要修改两个点
def urldecode_patch():
def uuuu(url, allowed_chars, encoding="utf-8"):
return url
import urllib3
import requests
requests.utils.UNRESERVED_SET = ''
urllib3.util.url._encode_invalid_chars = uuuu
urldecode_patch()
requests.utils.UNRESERVED_SET ,源码中原值如下图

调用如下,如果decode值为UNRESERVED_SET中的值,就decode;比如.%2e 将会变为 …

urllib3.util.url._encode_invalid_chars
此处修改,因为urlib3对%2e进行了一次大写转换

使用效果

本文介绍如何解决Python requests库在发送包含特殊字符如.%2e的URI请求时自动解码的问题。提供了三种解决方案:修改源码、继承Session及使用patch方法,并详细介绍了patch方法的具体实现。
565

被折叠的 条评论
为什么被折叠?



