requests 怎么配置 netrc 文件认证?查找路径、NETRC 环境变量与 trust_env 关闭方法
2026/9/9 13:46:59 网站建设 项目流程

requests 怎么配置 netrc 文件认证?查找路径、NETRC 环境变量与 trust_env 关闭方法

【免费下载链接】requestsA simple, yet elegant, HTTP library.项目地址: https://gitcode.com/GitHub_Trending/re/requests

如果你希望 Python 脚本访问需要 HTTP Basic Auth 的服务时不必在代码里硬编码账号密码,可以把凭据放进 netrc 文件,让 requests 按 URL 的主机名自动取用。本文基于 requests 仓库的文档与源码,说明 netrc 文件的查找位置、NETRC环境变量的覆盖规则,以及如何用trust_env彻底关闭这一行为。前提是已安装 requests(安装方式见 docs/user/install.rst)。

netrc 认证在 requests 中的触发条件

netrc 认证不是默认始终生效的,docs/user/authentication.rst 给出的规则是:

  • 只有当请求没有通过auth参数提供认证方式时,requests 才会尝试从用户的 netrc 文件中查找该 URL 主机名的凭据;
  • 找到凭据后,请求以HTTP Basic Auth的形式发出;
  • netrc 文件会覆盖通过headers=设置的原始 HTTP 认证头。

这一点在 src/requests/sessions.py 中可以直接核对:请求准备阶段只有当trust_env为真、且本次请求和 Session 都没有显式auth时,才会调用get_netrc_auth(url)填充凭据;Session初始化时trust_env默认就是True(src/requests/sessions.py)。

所以如果你的代码里写了auth=('user', 'pass'),netrc 文件不会生效,显式凭据优先。

netrc 文件的查找路径

requests 按固定顺序查找 netrc 文件,docs/user/authentication.rst 与 src/requests/utils.py 中的get_netrc_auth函数行为一致:

  1. 若设置了NETRC环境变量,则只查找该变量指定的路径(见下一节);
  2. 否则依次查找~/.netrc~/_netrc,使用第一个存在的文件。

其中~是用户主目录,在 Unix 系统上为$HOME,在 Windows 上为%USERPROFILE%

文件内容格式

仓库测试 tests/test_requests.py 中写入的 netrc 文件展示了 requests 实际解析的格式——按machineloginpassword三行一个条目:

machine example.com login wronguser password wrongpass machine api.myservice.example login user password pass

请求时 requests 用urlparse(url).hostname取出主机名,在文件中匹配对应的machine条目,取其中的 login 与 password(src/requests/utils.py)。上面的machineloginpassword值只是仓库测试中的示例,请替换为你自己服务的实际主机名和凭据。

用 NETRC 环境变量指定文件位置

默认路径不适用时(例如部署环境把凭据放在统一位置),可以设置NETRC环境变量指向任意 netrc 文件。设置后 requests 不再查找~/.netrc~/_netrc,只使用该路径。

仓库测试test_basicauth_with_netrc_leak(tests/test_requests.py)演示了完整用法:创建一个临时 netrc 文件,然后

import os old_netrc = os.environ.get("NETRC", "") os.environ["NETRC"] = "/path/to/your/netrc" # 替换为你的 netrc 文件路径 try: import requests r = requests.get("https://httpbin.org/basic-auth/user/pass") print(r.status_code) finally: os.environ["NETRC"] = old_netrc

该测试还验证了一个边界情况:netrc 里可以有多个machine条目,requests 只会为 URL 实际的主机名匹配对应条目,不会把别的机器上的凭据“泄露”到当前请求。

验证配置是否生效

docs/user/authentication.rst 使用 httpbin 的 basic-auth 接口作为验证手段,仓库测试(tests/test_requests.py)同样使用它。判断标准如下:

  • netrc 中为主机名配置的凭据正确时,不传auth参数的requests.get(url)返回<Response [200]>
  • 显式传入错误的auth=('wronguser', 'wrongpass')时返回<Response [401]>,证明显式凭据优先于 netrc,且服务端拒绝了错误凭据。

对应测试断言:

def get_netrc_auth_mock(url): return auth requests.sessions.get_netrc_auth = get_netrc_auth_mock r = requests.get(url) # 走 netrc,应为 200 assert r.status_code == 200 r = requests.get(url, auth=wrong_auth) # 显式错误凭据覆盖 netrc,应为 401 assert r.status_code == 401

Session 场景下行为相同:s.get(url)使用 netrc 成功,而s.auth = wrong_auth后同样失败(tests/test_requests.py)。

用 trust_env 关闭 netrc 文件

当程序运行在共享环境、或你明确不希望读取任何 netrc 配置时,可以在 Session 上关闭。docs/user/authentication.rst 给出的方法:

>>> s = requests.Session() >>> s.trust_env = False >>> s.get('https://httpbin.org/basic-auth/user/pass')

trust_env = False后,该 Session 的请求不会再调用get_netrc_auth——无论是首次请求还是重定向后的新主机(重定向时 requests 本会为新主机重新查 netrc,见 src/requests/sessions.py)。注意这一属性只影响该 Session 实例,模块级requests.get等函数不受影响;对模块级请求而言,等效做法是不设置NETRC并移走~/.netrc~/_netrc文件。

已知边界

  • netrc 文件不存在或解析出错、读取权限不足时,get_netrc_auth默认静默跳过netrc 认证,不报错;只有显式传入raise_errors=True调用该函数时才会抛出NetrcParseErrorOSError(src/requests/utils.py)。所以“凭据没生效但没有任何报错”时,可以先用raise_errors=True方式检查文件本身。
  • ~的解析依赖运行用户的HOME/USERPROFILE,在 Windows 服务、容器等非交互式环境下要确认主目录指向符合预期。
  • netrc 凭据通过 HTTP Basic Auth 发送,只适合服务端确实接受 Basic Auth 的场景;Digest、OAuth 等认证方式仍需用对应的auth参数显式指定(参见 docs/user/authentication.rst 的 Digest Authentication 与 OAuth 章节)。

【免费下载链接】requestsA simple, yet elegant, HTTP library.项目地址: https://gitcode.com/GitHub_Trending/re/requests

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询