Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python请求、工作代理和Django REST_Python_Django Rest Framework_Python Requests - Fatal编程技术网

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请求没有任何问题
我不确定的事情:

  • 我不知道我是否使用了正确的[代理]。有没有办法验证这一点?我尝试过使用[findMyProxy].com站点,但使用ip地址仍然不起作用
  • 我不知道我是否正确使用了
    [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')