python3.8 requests防止自动urlencode/decode

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

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

近期在项目中需要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进行了一次大写转换
在这里插入图片描述
使用效果
在这里插入图片描述

<think>好的,我现在需要解决用户的问题:在Python项目中遇到urllib3导入错误,提示需要OpenSSL 1.1.1+,但当前环境是OpenSSL 1.0.2g,用户想降级urllib3版本以适应旧版OpenSSL。用户使用的是Python 3.8和feapder框架。 首先,我得确认urllib3的版本兼容性。用户提到的错误信息显示urllib3 v2.0需要OpenSSL 1.1.1以上,而当前环境是1.0.2g,这明显不兼容。因此,降级urllib3到支持旧版OpenSSL的版本是合理的思路。根据经验,urllib3在2.0之前的版本可能支持更旧的OpenSSL,比如1.x系列。需要查阅urllib3的官方文档或版本发布说明,确认哪个版本兼容OpenSSL 1.0.2。 接下来,用户可能需要降级到urllib3 1.26.x或更早版本,因为这些版本在v2.0之前,可能没有强制要求OpenSSL 1.1.1。但需要验证这一点,确保选择的urllib3版本确实支持旧版OpenSSL。例如,urllib3 1.26.16可能是一个候选版本,因为它属于1.x系列的较新版本,且在v2.0之前。 然后,考虑用户使用的Python版本是3.8,这应该兼容大多数urllib3版本,但需要确认urllib3 1.x是否支持Python 3.8。通常,urllib3的旧版本对Python的支持范围较广,所以应该没问题。 用户提到的feapder框架可能有自己的依赖要求,如果feapder依赖于较高版本的urllib3,降级可能会导致冲突。因此,需要检查feapder的依赖关系,确保它允许使用urllib3 1.x。如果feapder强制要求urllib3>=2.0,那么可能需要寻找其他解决方法,比如升级OpenSSL或调整feapder的版本。 此外,用户的环境变量设置可能存在问题,根据引用[2],用户尝试修改LD_LIBRARY_PATH但无效,因为Python静态链接到OpenSSL。此时,重新编译Python以动态链接到新OpenSSL可能是一个解决方案,但用户希望降级urllib3而不是处理Python的编译问题,所以可能需要优先尝试降级urllib3。 另外,用户可能需要处理依赖冲突。如果项目中其他库依赖较高版本的urllib3,直接降级可能导致问题。这时候使用虚拟环境隔离项目,或者使用pip的--force-reinstall选项强制安装指定版本可能会有帮助。同时,可能需要降级其他依赖库,如requests,因为它们可能依赖于urllib3的较新版本。 最后,需要测试降级后的环境是否正常工作。安装指定版本的urllib3后,运行项目代码,检查是否仍然出现导入错误,并验证功能是否正常。如果问题依旧,可能需要进一步检查OpenSSL的链接情况,或者考虑其他方法如升级系统OpenSSL。</think>要解决Python项目中因OpenSSL版本不兼容导致的`urllib3`导入错误问题,可按照以下步骤操作: --- ### **步骤1:确认OpenSSL版本与Python链接方式** 首先检查当前系统的OpenSSL版本: ```bash openssl version # 输出示例:OpenSSL 1.0.2g ... ``` 再通过Python验证其链接的OpenSSL库路径: ```python import ssl print(ssl.OPENSSL_VERSION) # 输出链接的OpenSSL版本 print(ssl._ssl.__file__) # 输出_ssl模块路径[^2] ``` 若输出显示Python静态链接到旧版OpenSSL(如1.0.2g),则需降级`urllib3`。 --- ### **步骤2:降级urllib3到兼容版本** `urllib3 v2.0+`仅支持OpenSSL 1.1.1+,需降级到支持OpenSSL 1.0.x的版本。推荐使用`urllib3<2.0`: ```bash pip install "urllib3<2.0" --force-reinstall ``` 具体可选的兼容版本: - `urllib3==1.26.16`(最后一个兼容OpenSSL 1.0.x的稳定版本) - `urllib3==1.25.11` --- ### **步骤3:处理依赖冲突** 若项目中其他库(如`requests`、`botocore`)依赖新版本`urllib3`,需同步降级其版本: ```bash pip install "requests<2.29.0" "botocore<1.29.0" # 示例版本范围 ``` 或通过`requirements.txt`固定依赖: ``` urllib3==1.26.16 requests==2.28.2 botocore==1.28.2 ``` --- ### **步骤4:验证修复效果** 在Python中测试`urllib3`是否能正常导入: ```python import urllib3 print(urllib3.__version__) # 应输出1.26.x ``` --- ### **备选方案:升级OpenSSL环境** 若无法降级`urllib3`(如依赖强制要求新版本),需重新编译Python并动态链接到新版OpenSSL[^1]: 1. 安装OpenSSL 1.1.1+开发包: ```bash sudo apt install libssl-dev # Debian/Ubuntu ``` 2. 重新编译Python 3.8: ```bash ./configure --with-openssl=/usr/local/openssl # 指定新版OpenSSL路径 make && make install ``` --- ### **关键引用总结** 1. Python静态链接OpenSSL时,环境变量修改无效,需重新编译[^1][^2]。 2. `urllib3 v2.0+`强制依赖OpenSSL 1.1.1+,需降级到1.x版本[^1][^3]。 3. `ssl`模块的加密套件默认配置可能影响兼容性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值