Python请求、工作代理和Django REST
在此感谢您的帮助,提前谢谢 我的问题是:Python请求、工作代理和Django REST,python,django-rest-framework,python-requests,Python,Django Rest Framework,Python Requests,在此感谢您的帮助,提前谢谢 我的问题是: 我使用Python的Requests模块对工作代理后面的Django restapi进行get/post请求。我无法通过代理,我遇到了一个错误。我总结如下: 使用以下代码(我已经尝试过): 有了这个,我得到了一个错误: ... OSError('Tunnel connection failed: 407 Proxy Authentication Required'))) 其他背景: 这是在windows 10计算机上 Work使用“自动代理设置”
- 我使用Python的Requests模块对工作代理后面的Django restapi进行get/post请求。我无法通过代理,我遇到了一个错误。我总结如下:
... OSError('Tunnel connection failed: 407 Proxy Authentication Required')))
其他背景:
- 这是在windows 10计算机上
- Work使用“自动代理设置”脚本(.pac),查看该脚本,将根据机器的IP地址自动分配多个代理。我在上面的[proxy]下尝试过的所有代理,都有相同的错误
- 当我没有在工作网络中运行时,上面的方法可以工作,并且我不使用额外的代理设置(删除代理=代理)。i、 在我的家庭网络上
- 我对通过浏览器通过Django REST API视图的代理发送get请求没有任何问题
[domain]\[userName]
。\
正确吗?我的工作确实使用了一个域pip安装--proxy http://[domain]\[userName]:[password]@[proxy]:8080somemodule
也会出现相同的407错误感谢您的帮助。我是如何找到解决方案的:
curl
建立了一个
,经过多次尝试和错误,成功是:$curl-U域\用户:PW-v-xhttp://LOCATION_OF_PAC_FILE --代理ntlm www.google.com
- 其中-U是域、用户名和密码
- -V是冗长的,便于调试
- -x是代理,在我的例子中是.pac文件的位置。Curl自动从PAC确定代理IP。请求在默认情况下不会这样做(据我所知)
- 我使用curl来确定我的代理使用的是ntlm
- 作为测试代理身份验证的外部站点
- 注意:域和用户名之间只有1个
\
request
使用ntlm,我发现默认情况下是不可能的,而是使用requests-ntlm2
request-ntlm2
的PAC文件不起作用,因此我使用pypac
自动发现PAC文件,然后根据URL确定代理从pypac导入PACSession
从请求\u ntlm2导入(
HttpNtlmAuth,
HttpNtlmAdapter,
NTLM兼容性
)
用户名='DOMAIN\\username'
密码='PW'
#由于pypacs,不需要以下内容
#proxy_ip='proxy_ip'
#代理\u port=“端口”
#代理={
#'http':'http://{}:{}'。格式(代理ip,代理端口),
#'https':'http://{}:{}'。格式(代理ip,代理端口)
# }
ntlm\u兼容性=NtlmCompatibility.NTLMv2\u默认值
#session=requests.session()如果您可以使用浏览器,那么应该在那里配置代理。例如,你可以在Chrome中查找它们。我建议尝试使用命令行和curl
或wget
执行一些简单的GET
请求,并确保考虑到代理(例如curl-x您的代理)http://example.com
)。你好,马瑞克,谢谢你抽出时间给我回复。我找到了解决办法,你的回答帮了我。最后我确实使用了curl
来确定瓶颈是什么,从中我发现我的组织使用了ntlm。。。看下面我是如何到达比赛终点的。
... OSError('Tunnel connection failed: 407 Proxy Authentication Required')))
from pypac import PACSession
from requests_ntlm2 import (
HttpNtlmAuth,
HttpNtlmAdapter,
NtlmCompatibility
)
username = 'DOMAIN\\USERNAME'
password = 'PW'
# Don't need the following thanks to pypacs
# proxy_ip = 'PROXY_IP'
# proxy_port = "PORT"
# proxies = {
# 'http': 'http://{}:{}'.format(proxy_ip, proxy_port),
# 'https': 'http://{}:{}'.format(proxy_ip, proxy_port)
# }
ntlm_compatibility = NtlmCompatibility.NTLMv2_DEFAULT
# session = requests.Session() <- replaced with PACSession()
session = PACSession()
session.mount(
'https://',
HttpNtlmAdapter(
username,
password,
ntlm_compatibility=ntlm_compatibility
)
)
session.mount(
'http://',
HttpNtlmAdapter(
username,
password,
ntlm_compatibility=ntlm_compatibility
)
)
session.auth = HttpNtlmAuth(
username,
password,
ntlm_compatibility=ntlm_compatibility
)
# Don't need the following thanks to pypacs
# session.proxies = proxies
response = session.get('http://www.google.com')