python请求不使用谷歌应用程序引擎

Con*_*nor 6 python django google-app-engine python-requests

我正在尝试使用以下代码的python请求获取页面views.py:

s = requests.Session()
r = s.get("https://www.23andme.com/")
Run Code Online (Sandbox Code Playgroud)

我收到错误Exceeded 30 redirects.我的应用程序是Google App Engine Django应用程序.我已经将此代码用于python控制台和pythonanywhere.com上的django服务器,但由于某种原因它不适用于谷歌应用引擎.可能是什么导致了这个?谢谢

编辑:似乎我的应用程序中的"请求"模块存在另一个问题.我有这个代码将电子邮件添加到mailchimp列表:

m = mailchimp.Mailchimp(MAILCHIMP_API_KEY)
list_response = m.lists.list()
Run Code Online (Sandbox Code Playgroud)

但如果因错误而失败 HTTPS/SSL is required

yuv*_*uvi 5

尝试安装urllib3(和其他东西,见下文).

请注意,历史上,谷歌应用引擎的请求存在大量问题(请参阅问题#498).这些主要是通过对v1.3附带的GAE的urllib3支持解决的.它很久以前就出现了(当前版本是1.7),所以它可能不是问题,但是当你最初安装请求时,它包含urllib3在一个名为的文件夹中packages,也许它不包括它的全部内容.

我也尝试搜索源代码requests,发现这很有趣:

# Attempt to enable urllib3's SNI support, if possible
try:
    from requests.packages.urllib3.contrib import pyopenssl
    pyopenssl.inject_into_urllib3()
except ImportError:
    pass
Run Code Online (Sandbox Code Playgroud)

更进一步,该contrib软件包包含一个pyopenssl.py脚本,该脚本需要:

具有SNI支持的SSL 2的SSL.

这需要安装以下软件包:

  • pyOpenSSL(用0.13测试)
  • ndg-httpsclient(用0.3.2测试)
  • pyasn1(用0.1.6测试)

所以,总结一下:

  1. 安装urllib3和上面提到的其他SSL包,然后尝试运行您再次执行的请求,看看是否有任何更改.我的猜测是,这将(至少)帮助,mailchimp因为它也抱怨SSL/HTTPS问题.

  2. 如果这不起作用,请尝试使用urllib3 api而不是requests执行相同的任务,看看是否有效.如果是这样,问题特别urllib3在于requests正在使用的打包,这可能需要一些修补.

    import urllib3
    http = urllib3.PoolManager()
    r = http.request('GET', 'https://www.23andme.com/')
    
    Run Code Online (Sandbox Code Playgroud)

对不起,这不是一个明确的解决方案,希望我的一个建议会有所帮助.更新我的进展情况,我会尽力帮助


Con*_*nor 2

根据讨论,问题出在 Google App Engine 上的 netrc 上。我能够通过使用旧版本的 Requests 来解决这个问题(在我的例子中是 1.2.3,但其他版本也可能有效。)

编辑:根据这个答案,Requests 2.1.0 也应该可以工作。

  • 另请参阅[此](http://stackoverflow.com/questions/21605328/python-requests-on-google-app-engine-not-working-for-https?rq=1) (2认同)