我能在Google App Engine上使用Requests库吗?我认为这个库非常适合创建REST客户端。
requests-toolbelt
库:
https://github.com/sigmavirus24/requests-toolbelt
对于App Engine,可以使用以下命令: pip install requests-toolbelt -t lib
from requests_toolbelt.adapters import appengine
appengine.monkeypatch()
ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))
requests 2.4.1在生产中出现以下问题:
File "distlib/requests/adapters.py", line 407, in send
raise ConnectionError(err, request=request)
ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))
requests版本2.5.1在生产环境中出现故障:
File "distlib/requests/adapters.py", line 415, in send
raise ConnectionError(err, request=request)
ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))
请求库版本2.3.0可以在生产环境中使用,但可能会在Debian SDK删除了SSLv3支持后出现问题(requests 2.3.0附带了已过时的urllib3)。作为解决方法,可以在请求库urllib3副本的源代码中删除包含PROTOCOL_SSLv3的行。
'module' object has no attribute 'PROTOCOL_SSLv3'
有关套接字支持的信息:https://cloud.google.com/appengine/docs/python/sockets/
现在可以做到了,我使用appengine_config.py中的以下解决方案组合使它起作用:
# Step 1: first add requests and requests-toolbelt to your requirements.txt (or however you install them via pip)
# Step 2: in appengine_config.py add the following snippet:
# see https://cloud.google.com/appengine/docs/python/issue-requests#issuing_an_http_request
import requests
import requests_toolbelt.adapters.appengine
# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()
# also monkey patch platform.platform() from https://code.google.com/p/googleappengine/issues/detail?id=12982
import platform
def patch(module):
def decorate(func):
setattr(module, func.func_name, func)
return func
return decorate
@patch(platform)
def platform():
return 'AppEngine'
def platform()
不需要缩进。 - vkbtry:
from google.appengine.api import urlfetch
from requests_toolbelt.adapters import appengine
appengine.monkeypatch()
except ImportError:
pass
是的,您可以使用requests模块。 GCP默认不支持使用Requests库。因此,我们需要进行一些调整才能使其正常工作。 为了在Google App Engine上部署应用程序,我们需要创建一个main.py(包含主Python Flask应用程序)和一个app.yaml(运行所需的配置文件)。 以下是Python 2.7环境下app.yaml文件的示例代码:
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /.*
redirect_http_response_code: 301
script: main.app
libraries:
- name: flask
version: 0.12
现在我们需要配置请求库以在内部使用URLfetch。 为了使用requests,我们需要按照供应商指南安装requests和requests-toolbelt。(https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#installing_a_library)。 基本上,我们需要安装自定义库。
编辑appengine_config.py文件,并向vendor.add()方法提供您的库目录。 示例appengine_config.py文件
from google.appengine.ext import vendor
# Add any libraries install in the "lib" folder.
vendor.add('lib/requests')
vendor.add('lib/requests_toolbelt')
安装后,使用requests_toolbelt.adapters.appengine模块配置请求以使用URLFetch。 将以下代码复制到您的main.py文件开头
import requests
from requests_toolbelt.adapters import appengine
appengine.monkeypatch(validate_certificate=True)
(https://cloud.google.com/appengine/docs/standard/python/issue-requests)
现在我们可以轻松使用requests库来进行get/post请求。 测试你的应用程序:dev_appserver.py --port=<port number> app.yaml
urlfetch
,它在免费配额下可用但具有一些限制。例如,它当前不支持客户端证书,而这与目前接受的答案中所使用的套接字有关的方法相反。 - David Pärsson