近期在项目中需要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进行了一次大写转换
使用效果