requests 能不能优雅地配置全局代理?

2022-07-17 11:16:27 +08:00
 nyxsonsleep

设置一次代理,单项目中,始终有效。

不需要改系统配置。

也不用重写 session ,或者说能重写之后形如 requests.get(xxx)地使用。不必实例化 session 传来传去。

4311 次点击
所在节点    Python
12 条回复
frostming
2022-07-17 11:17:53 +08:00
os.environ.update(HTTP_PROXY=<proxy_url>, HTTPS_PROXY=<proxy_url)
nyxsonsleep
2022-07-17 11:32:13 +08:00
@frostming
有没有更好点的方法呢。
设置了这个之后后续某几次需要再换代理的话,requests 里的 proxy 就无效了。
那样就需要 os.environ.update 两次。次数多了有点呆。
frostming
2022-07-17 11:53:10 +08:00
@nyxsonsleep 设置了这个之后后续某几次需要再换代理的话,requests 里的 proxy 就无效了

不知这个结论如何得出,proxies 参数是优先于环境变量的,也就是会覆盖后者的值

https://requests.readthedocs.io/en/latest/user/advanced/#proxies:~:text=When%20the%20proxies,to%20your%20needs)%3A
GoLand
2022-07-17 11:53:24 +08:00
@nyxsonsleep 初始化一个 request.Session 实例当做全局变量不就得了。
nyxsonsleep
2022-07-17 12:07:32 +08:00
@GoLand
可我就是不想要传全局变量 session 才来问的啊。
简单来说,就是在不改动已写了的大量 requests.get(xxx)的情况下。
最好是简单重写一下 requests 的什么类或者方法,做加法,不用大量替换原有的代码。
还要保证新 get post 等方法中的单独设置的 proxies 仍然有效
GoLand
2022-07-17 12:12:33 +08:00
@nyxsonsleep 有比较花哨但是比较危险的做法,用 https://github.com/GrahamDumpleton/wrapt 这个把 requests.get 方法实现替换掉,如果没有传 proxies 参数就自动把代理信息注入进去。
arischow
2022-07-17 12:13:26 +08:00
自己再封装一层
frostming
2022-07-17 12:31:24 +08:00
@nyxsonsleep 环境变量就是最优雅的办法,能满足你说的需求,你以为的结论是错的
l4ever
2022-07-17 12:43:27 +08:00
自已封装一个函数啊不就行了吗?
所有的 http 请求都调自己的函数发起.
GoLand
2022-07-17 12:46:01 +08:00
404neko
2022-07-17 15:04:20 +08:00
import socket
import socks
import requests

ip = 'localhost'
port = 1080

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, ip, port)
socket.socket = socks.socksocket
ch2
2022-07-17 19:48:23 +08:00
自己搞个单例模式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX