本地运行正常,部署至Vercel等云平台时遇ProxyError(403 Forbidden)问题
解决部署Django视图到云平台后访问ecourts.gov.in出现403代理错误的问题
问题描述
这段获取印度法院系统验证码的Django视图在本地运行正常,但部署至Vercel、PythonAnywhere等云平台时,出现如下错误:
HTTPSConnectionPool(host='services.ecourts.gov.in', port=443): Max retries exceeded with url: /ecourtindia_v4_bilingual/cases/case_no.php?state=D&state_cd=1&dist_cd=23 (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden')))
解决方案
1. 禁用云平台自动代理
部分云平台会自动设置全局代理环境变量,导致requests使用平台代理访问目标网站时被拒绝。可以强制requests不使用代理:
import os # 清除环境中的代理变量 os.environ.pop('HTTP_PROXY', None) os.environ.pop('HTTPS_PROXY', None) @api_view(['GET']) def get_captcha(request): url = 'https://services.ecourts.gov.in/ecourtindia_v4_bilingual/cases/case_no.php?state=D&state_cd=1&dist_cd=23' # 发起请求时显式指定空代理 response = requests.get(url, proxies={'http': None, 'https': None}) # 后续代码保持不变...
2. 添加模拟浏览器的请求头
目标网站可能会识别非浏览器请求并拦截,添加常见的浏览器请求头可以绕过检测:
@api_view(['GET']) def get_captcha(request): url = 'https://services.ecourts.gov.in/ecourtindia_v4_bilingual/cases/case_no.php?state=D&state_cd=1&dist_cd=23' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://services.ecourts.gov.in/ecourtindia_v4_bilingual/cases/case_no.php', 'Accept-Language': 'en-US,en;q=0.9' } response = requests.get(url, headers=headers, proxies={'http': None, 'https': None}) # 后续代码保持不变...
3. 使用会话保持请求一致性
目标网站可能依赖会话Cookie验证请求合法性,使用requests.Session()维持会话:
@api_view(['GET']) def get_captcha(request): url = 'https://services.ecourts.gov.in/ecourtindia_v4_bilingual/cases/case_no.php?state=D&state_cd=1&dist_cd=23' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://services.ecourts.gov.in/ecourtindia_v4_bilingual/cases/case_no.php' } session = requests.Session() session.headers.update(headers) # 先访问主页获取会话Cookie session.get('https://services.ecourts.gov.in/') # 再请求验证码页面 response = session.get(url) # 后续代码保持不变...
4. 更换出站IP(针对云平台)
如果云平台的共享IP被目标网站封禁:
- PythonAnywhere:可以联系客服申请更换IP,或使用付费计划的专属IP
- Vercel:尝试使用Edge Functions部署视图,Edge节点的IP分布更广;或配置自定义域名的IP(需额外服务)
内容的提问来源于stack exchange,提问作者Pankaj Jaiswal
相关产品推荐
相关产品推荐

