Windows 7下REST请求被拦截问题求助
排查Windows 7下Python REST请求失败的问题
刚踩过类似的坑,结合你的情况(Ubuntu正常、浏览器可访问、已开5000端口防火墙),给你几个具体的排查方向和解决办法:
1. 检查代理设置干扰
Windows系统的代理配置可能会影响Python的网络请求,而浏览器通常会自动适配代理,导致两者行为不一致。
- 先排查Python是否继承了不必要的代理:在代码里添加以下代码打印当前代理环境变量:
如果输出了非预期的代理地址,可以在代码里强制禁用代理(以import os print("HTTP_PROXY:", os.environ.get('HTTP_PROXY')) print("HTTPS_PROXY:", os.environ.get('HTTPS_PROXY'))requests库为例):
或者直接在系统环境变量中删除对应的代理配置。import requests response = requests.get(your_rest_url, proxies={"http": None, "https": None})
2. 修正防火墙规则(针对Python进程而非仅端口)
你开放了5000端口的规则,但Windows防火墙可能是拦截了Python程序本身的网络请求,而非端口。
- 手动添加允许Python.exe的防火墙规则:
- 打开「控制面板 → Windows防火墙 → 高级设置」
- 分别在「出站规则」和「入站规则」中点击「新建规则」
- 选择「程序」→ 点击「浏览」找到你Python安装目录下的
python.exe(比如C:\Python38\python.exe) - 选择「允许连接」,然后按向导完成配置
这样能确保Python进程的网络请求不会被防火墙拦截,比单纯开放端口更精准。
3. 强制启用TLS 1.2(Windows 7 SSL兼容性问题)
Windows 7默认的TLS版本支持有限,很多现代REST服务要求TLS 1.2或更高,但旧版本Python在Windows 7下可能默认不启用。
- 如果使用
requests库,可以通过自定义适配器强制使用TLS 1.2:
这个方法能解决大部分因SSL版本不兼容导致的请求失败问题。import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import ssl class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2 ) # 创建会话并挂载适配器 session = requests.Session() session.mount('https://', TLS12Adapter()) session.mount('http://', TLS12Adapter()) # 发起请求 try: response = session.get(your_rest_url) response.raise_for_status() print(response.text) except Exception as e: print(f"请求失败: {str(e)}")
4. 检查Python版本与杀毒软件
- Windows 7最高支持Python 3.8,如果你用的是更老的版本(比如Python 2.7或3.6之前),可能存在网络模块的兼容性问题,尝试升级到Python 3.8试试。
- 临时关闭杀毒软件或安全工具:有些杀毒软件会默认拦截未知程序的出站请求,关闭后测试是否能正常发起请求,确认后再给Python添加信任规则。
5. 验证URL与请求细节
虽然浏览器能访问,但可以再确认下代码中的URL是否有拼写错误,或者是否需要添加请求头(比如User-Agent)模拟浏览器请求:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } response = requests.get(your_rest_url, headers=headers, proxies={"http": None, "https": None})
内容的提问来源于stack exchange,提问作者Santi Peñate-Vera




