Python 项目 API 代理转发:解决跨平台外网访问难题
解决的核心问题
跨平台代理访问痛点
Windows 系统代理问题:设置显示"手动代理已打开",但实际请求失败,需要额外开启"自动检测代理"才生效,但是有时候也正常,有时候也异常,不知道是代理节点问题还是系统代理问题
macOS 相对稳定:系统代理能正常工作
影响面太广:系统代理会影响所有应用
环境不一致:开发和生产环境代理配置差异
解决方案
绕过系统代理复杂性,直接为 Python 项目设置代理环境变量,只代理项目的外网请求!
实现方案
方案 1:Python 启动脚本(推荐)
创建 proxy_runner.py:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Python项目API代理转发脚本
"""
import os
import sys
import subprocess
import socket
def check_proxy_port(host="localhost", port=7890):
"""检查代理端口是否开放"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)
result = sock.connect_ex((host, port))
sock.close()
return result == 0
except:
return False
def test_proxy_connection(proxy_url):
"""测试代理连接"""
try:
print("🔍 测试代理连接...")
import httpx
with httpx.Client(timeout=8.0) as client:
response = client.get("https://httpbin.org/ip")
if response.status_code == 200:
ip_info = response.json()
print(f"✅ 代理连接正常,外网IP: {ip_info.get('origin', 'Unknown')}")
return True
else:
print(f"⚠️ 代理响应异常: HTTP {response.status_code}")
return False
except Exception as e:
print(f"⚠️ 代理连接测试失败: {e}")
return False
def main():
proxy_url = "http://localhost:7890" # Clash HTTP代理地址
target_file = "main.py" # 要启动的Python文件
print("🚀 启动项目...")
print(f"📡 HTTP代理: {proxy_url}")
print("-" * 50)
# 1. 检查代理端口
if not check_proxy_port():
print("❌ 代理端口7890无法连接")
print("💡 请确保Clash正在运行且本地HTTP代理端口(7890)已开启")
return
print("✅ 代理端口连接正常")
# 2. 设置代理环境变量
os.environ['HTTP_PROXY'] = proxy_url
os.environ['HTTPS_PROXY'] = proxy_url
os.environ['http_proxy'] = proxy_url
os.environ['https_proxy'] = proxy_url
os.environ['NO_PROXY'] = 'localhost,127.0.0.1,::1'
os.environ['no_proxy'] = 'localhost,127.0.0.1,::1'
# 3. 测试代理连接
proxy_ok = test_proxy_connection(proxy_url)
if not proxy_ok:
print("⚠️ 代理测试失败,可能原因:")
print(" • Clash本地HTTP代理端口(7890)未正常工作")
print(" • 代理节点连接异常")
choice = input("\n是否继续启动? (y/N): ").lower().strip()
if choice != 'y':
print("👋 启动已取消")
return
# 4. 启动项目
print("\n🌐 项目外网请求将通过Clash代理访问")
print("🛡️ 项目本身API接口正常提供服务(不走代理)")
print("⏹️ 按 Ctrl+C 停止服务")
print("=" * 50)
try:
subprocess.run([sys.executable, target_file], env=os.environ.copy())
except KeyboardInterrupt:
print("\n👋 服务已停止")
except FileNotFoundError:
print(f"\n❌ 文件不存在: {target_file}")
except Exception as e:
print(f"\n❌ 启动失败: {e}")
if __name__ == "__main__":
main()使用方式:
python proxy_runner.py方案 2:控制台一行命令
macOS/Linux:
# 基本用法
HTTP_PROXY=http://localhost:7890 HTTPS_PROXY=http://localhost:7890 python main.py
# 更完整的设置
env HTTP_PROXY=http://localhost:7890 HTTPS_PROXY=http://localhost:7890 NO_PROXY=localhost,127.0.0.1 python main.pyWindows CMD:
set HTTP_PROXY=http://localhost:7890 && set HTTPS_PROXY=http://localhost:7890 && python main.pyWindows PowerShell:
$env:HTTP_PROXY="http://localhost:7890"; $env:HTTPS_PROXY="http://localhost:7890"; python main.py方案优势
解决 Windows 代理问题 - 绕过系统代理机制
精确控制 - 只代理外网请求,不影响项目 API
零代码侵入 - 无需修改项目代码
跨平台一致 - macOS 和 Windows 表现相同
代理范围说明
会被代理的请求
import requests
# OpenAI API、GitHub API等外网请求
requests.post("https://api.openai.com/v1/chat/completions")
requests.get("https://api.github.com/user")不会被代理的请求
# 项目本身的API接口、本地服务
requests.get("http://localhost:8002/api/health")
requests.get("http://127.0.0.1:3000/status")使用演示
Python 脚本启动效果
🚀 启动项目...
📡 HTTP代理: http://localhost:7890
--------------------------------------------------
✅ 代理端口连接正常
🔍 测试代理连接...
✅ 代理连接正常,外网IP: 107.167.18.110
🌐 项目外网请求将通过Clash代理访问
🛡️ 项目本身API接口正常提供服务(不走代理)
⏹️ 按 Ctrl+C 停止服务
==================================================控制台命令启动
# 一行命令启动,简单直接
$ HTTP_PROXY=http://localhost:7890 HTTPS_PROXY=http://localhost:7890 python main.py适用场景
🤖 AI API 集成项目:OpenAI、Claude 等 API 调用
🕷️ 爬虫和数据采集:外网数据抓取
🔗 第三方 API 聚合:微服务外网 API 调用
注意事项
- 确保 Clash 的 HTTP 代理端口已开启(默认 7890 端口)
代理节点类型说明
无论选择的代理节点是什么协议(SOCKS5、VMess、Trojan 等),只要 Clash 本地 HTTP 代理端口(7890)正常工作,Python 项目就能正常使用代理。
检查代理节点稳定性,避免连接异常
脚本方案提供检测和验证,命令行方案更简洁快速
可扩展
当前方案:所有外网请求都走代理,如果需要某些请求不走代理,可以添加到 NO_PROXY 环境变量中,比如:
os.environ['NO_PROXY'] = 'localhost,127.0.0.1,::1'可以使用 Ai 升级脚本添加配置代理规则
总结
通过环境变量设置代理,完美解决 Python 项目外网访问问题:
Python 脚本方案:功能完整,有检测验证,适合复杂项目
控制台命令方案:一行搞定,适合简单快速启动
选择适合的方案,让项目外网 API 访问更稳定!