【发布时间】:2018-08-30 18:38:21
【问题描述】:
免责声明:这不是重复的!
我正在使用 requests 库,在 GAE 标准环境下修补了猴子,一切都完美无缺,除了我在请求调用中添加额外的 proxy 参数的时候。这个代理的东西意味着隧道和套接字操作,默认情况下,开发和部署环境的标准配置都禁用了这些操作:
NotImplementedError: HTTP CONNECT Tunnelling is not supportedhttps://pastebin.com/YDsG9we7
很好,所以我们需要在我们的 GAE 平台下启用真正的套接字支持,因此添加:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : "True"
即使没有做请求工具带猴子补丁(根本不使用 urlfetch),我们也会获得一个权限被拒绝:https://pastebin.com/ifBFKi3K
这通常发生在沙盒认为您正在访问禁止的服务器位置或端口时,但代理功能齐全,猜猜是什么,我测试了完全相同的代码(没有任何由于开发或将服务器部署为当前环境而添加/删除的功能)并且它在部署时按预期工作,没有任何Permission denied 错误,通过使请求完全成功(如果我们尝试不启用 httplib 套接字,我们仍然在这两种情况下都会出现 Tunnelling is not supported 错误,这是预期的行为)。
现在,我在部署上有一个可行的解决方案(这才是真正重要的),但这对我来说还不够,我只想通过我的开发服务器和环境下的代理测试这些请求,所以我试图做的是:
- 让我们通过应用这些来导入我们自己的标准套接字库:"ImportError: No module named _ssl" with dev_appserver.py from Google App Engine
- 无法修改 sandbox.py 文件以将
_sockets和_ssl等列入白名单,没问题,我已将其直接在磁盘上硬修补到原始文件中 - 将默认套接字、httplib 导入等替换为标准的 Python 接口
-
问题:
ValueError: select only supported on socket objects.https://pastebin.com/gHFM6QiF;这在某种程度上预计会发生,因为由于标准sockets导入但GAE自己的select,预期的套接字对象与预期的不同(并且通过从解释器的内存中删除选择只会导致更多问题或不起作用完全),所以我也想用标准的pythonic模块替换select模块(内置),我该怎么做?
- 无法修改 sandbox.py 文件以将
没关系...
是否有任何方法可以结束这场噩梦并仍然使用标准环境?如果它在没有任何补丁的情况下在部署服务器上工作,为什么不应该也与 dev_appserver 工具一起工作?
我只是不想再做任何补丁,我只想克服在远程部署服务器下不会抛出的Permission denied 错误,使用相同的代码逻辑,无论我们是否使用请求, urlfetch、httplib、sockets 等(只是代理所需的隧道)。
【问题讨论】:
-
进一步挖掘问题:
标签: python sockets google-app-engine proxy tunneling