Отказ от ответственности: это не дубликат!
Я использую библиотеку запросов, обезьяна исправлена в стандартной среде GAE, и все работает безупречно, за исключением случаев, когда я добавляю дополнительный аргумент proxy
к вызову запроса. Этот прокси подразумевает операции туннелирования и сокетов, которые по умолчанию отключены стандартной конфигурацией как среды разработки, так и среды развертывания:
NotImplementedError: HTTP CONNECT Tunnelling is not supported
https://pastebin.com/YDsG9we7
Хорошо, поэтому нам нужно включить поддержку реальных сокетов на нашей платформе GAE, поэтому добавьте:
env_variables:
GAE_USE_SOCKETS_HTTPLIB : "True"
И даже не выполняя патч для обезьян с инструментальным поясом запросов (вообще не используя urlfetch), мы получаем отказ в разрешении: https://pastebin.com/ifBFKi3K
Обычно это происходит, когда песочница считает, что вы обращаетесь к запрещенному расположению сервера или порту, но прокси-сервер полностью функционален, и знаете что, я тестировал тот же самый код (без каких-либо добавленных/удаленных функциональность из-за разработки или развертывания сервера в качестве текущей среды), и он работает так же, как и ожидалось, при развертывании, без каких-либо ошибок Permission denied
, делая запрос полностью успешным (если мы попробуем без включенных сокетов httplib, мы все равно получим эту ошибку Tunnelling is not supported
в оба сценария, и это ожидаемое поведение).
Теперь у меня есть рабочее решение для деплоя (а это то, что действительно имеет значение), но мне этого недостаточно, я просто хочу протестировать эти запросы через прокси под моим сервером разработки и в среде, так что я я пытался сделать следующее:
- let's import our own standard sockets library by applying these: "ImportError: No module named _ssl" with dev_appserver.py from Google App Engine
- can't monkey patch the sandbox.py file for white-listing
_sockets
and_ssl
etc., no problem, I've hard-patched that directly on disk into the original file - замена в памяти сокетов по умолчанию, импорта httplib и т. д. на стандартные питонические
- ПРОБЛЕМА:
ValueError: select only supported on socket objects.
https://pastebin.com/gHFM6QiF ; и это каким-то образом ожидается, поскольку ожидаемый объект сокета отличается от ожидаемого из-за стандартного импортаsockets
, но собственногоselect
GAE (и удаление выбора из памяти интерпретатора просто вызовет больше проблем или не будет работать вообще), поэтому я хочу заменить модульselect
(который является встроенным) стандартным pythonic, как я могу это сделать?
- can't monkey patch the sandbox.py file for white-listing
Неважно...
Есть ли какой-то метод, с помощью которого этот кошмар закончится и все еще с использованием стандартной среды? Если он работает на сервере развертывания вообще без каких-либо исправлений, почему бы не работать и с инструментом dev_appserver?
Я просто не хочу делать больше патчей, я просто хочу обойти эту ошибку Permission denied
, которая не возникает на сервере удаленного развертывания, используя ту же логику кода, независимо от того, используем ли мы запросы, urfetch, httplib, сокеты и т. д. (просто необходимая вещь для туннелирования прокси).