V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
nyxsonsleep
V2EX  ›  Python

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

  •  
  •   nyxsonsleep · 2022-07-17 11:16:27 +08:00 · 4253 次点击
    这是一个创建于 620 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    不需要改系统配置。

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

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

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

    https://requests.readthedocs.io/en/latest/user/advanced/#proxies:~:text=When%20the%20proxies,to%20your%20needs)%3A
    GoLand
        4
    GoLand  
       2022-07-17 11:53:24 +08:00
    @nyxsonsleep 初始化一个 request.Session 实例当做全局变量不就得了。
    nyxsonsleep
        5
    nyxsonsleep  
    OP
       2022-07-17 12:07:32 +08:00
    @GoLand
    可我就是不想要传全局变量 session 才来问的啊。
    简单来说,就是在不改动已写了的大量 requests.get(xxx)的情况下。
    最好是简单重写一下 requests 的什么类或者方法,做加法,不用大量替换原有的代码。
    还要保证新 get post 等方法中的单独设置的 proxies 仍然有效
    GoLand
        6
    GoLand  
       2022-07-17 12:12:33 +08:00
    @nyxsonsleep 有比较花哨但是比较危险的做法,用 https://github.com/GrahamDumpleton/wrapt 这个把 requests.get 方法实现替换掉,如果没有传 proxies 参数就自动把代理信息注入进去。
    arischow
        7
    arischow  
       2022-07-17 12:13:26 +08:00
    自己再封装一层
    frostming
        8
    frostming  
       2022-07-17 12:31:24 +08:00
    @nyxsonsleep 环境变量就是最优雅的办法,能满足你说的需求,你以为的结论是错的
    l4ever
        9
    l4ever  
       2022-07-17 12:43:27 +08:00
    自已封装一个函数啊不就行了吗?
    所有的 http 请求都调自己的函数发起.
    GoLand
        10
    GoLand  
       2022-07-17 12:46:01 +08:00
    404neko
        11
    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
        12
    ch2  
       2022-07-17 19:48:23 +08:00 via iPhone
    自己搞个单例模式
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3258 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:53 · PVG 19:53 · LAX 04:53 · JFK 07:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.