SSF0SSF0
首页
前端
  • Node
  • Go
  • Python
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
  • 开源项目
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • Python
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
  • 开源项目
Timeline
Github
标签
分类
  • Node.js

    • 在 Docker 容器中运行 Node.js Koa 应用的网络配置与常见问题
    • 在 Node.js 后端实现邮箱验证码功能
    • Redis 与 JWT 结合的 Token 验证方案
    • Node.js 后端三层架构中的错误处理最佳实践
    • 在 Koa 中批量设置路由 JWT 校验的最佳实践
    • 前端开发者的 Redis 入门指南
    • AI工具系统架构设计
    • Koa 项目中间件设计技巧与最佳实践
  • Go

    • Go1
    • Go2
  • Python

    • Python 项目 API 代理转发:解决跨平台外网访问难题
  • MySql

    • 数据库连接

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.py

Windows CMD:

set HTTP_PROXY=http://localhost:7890 && set HTTPS_PROXY=http://localhost:7890 && python main.py

Windows 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 调用

注意事项

  1. 确保 Clash 的 HTTP 代理端口已开启(默认 7890 端口)

代理节点类型说明

无论选择的代理节点是什么协议(SOCKS5、VMess、Trojan 等),只要 Clash 本地 HTTP 代理端口(7890)正常工作,Python 项目就能正常使用代理。

  1. 检查代理节点稳定性,避免连接异常

  2. 脚本方案提供检测和验证,命令行方案更简洁快速

可扩展

当前方案:所有外网请求都走代理,如果需要某些请求不走代理,可以添加到 NO_PROXY 环境变量中,比如:

os.environ['NO_PROXY'] = 'localhost,127.0.0.1,::1'

可以使用 Ai 升级脚本添加配置代理规则

总结

通过环境变量设置代理,完美解决 Python 项目外网访问问题:

  • Python 脚本方案:功能完整,有检测验证,适合复杂项目

  • 控制台命令方案:一行搞定,适合简单快速启动

选择适合的方案,让项目外网 API 访问更稳定!

最后更新时间:
贡献者: 何风顺