使用请求python库在Google App Engine中发送HTTPS请求

时间:2014-06-04 17:26:38

标签: google-app-engine python-2.7 ssl python-requests google-translate

标题几乎总结了一下,我正在向谷歌翻译API请求:

    payload = {"key":translate_api_key, "q":str(sentence)}
    try:
        api_response = requests.get("https://www.googleapis.com/language/translate   /v2/detect", params=payload)

    except Exception, e:
        print e

这通常正常工作(我的意思是将其作为我桌面上的脚本运行)但在谷歌应用引擎服务器上我得到了这样的回复:

{u'error': {u'message': u'SSL is required to perform this operation.', u'code': 403, u'errors': [{u'message': u'SSL is required to perform this operation.', u'domain': u'global', u'reason': u'sslRequired'}]}}

我该如何解决这个问题?

编辑: 似乎请求的https与GAE没有很好的协作。使用urlfetch和urllib似乎解决了这个问题。

payload = dict(key=translate_api_key, q=sentence) 
payload = urllib.urlencode(payload) 
url = "https://www.googleapis.com/language/translate/v2/detect?"
api_response = urlfetch.fetch(url+payload)

3 个答案:

答案 0 :(得分:1)

我没有使用请求库的经验,但可能是它未在App Engine上完全实现。

App Engine上的首选方法是使用urlfetch

from google.appengine.api import urlfetch

url = "https://www.googleapis.com/language/translate/v2/detect"

payload = {"key":translate_api_key, "q":str(sentence)}

result = urlfetch.fetch(url=url, payload=payload)
if result.status_code == 200:
  api_response = result.content

答案 1 :(得分:0)

您可以在app.yaml

中试用
handlers:
- url: /youraccount/.*
  script: accounts.py
  login: required
  secure: always

secure:always使您的网站ssl成为可能。我不确定这是不是真正的问题。

答案 2 :(得分:0)

GCP不支持立即使用请求库。因此,我们必须花一些时间才能使它生效。 为了在Google App Engine上部署应用程序,我们需要制作main.py(主python flask应用程序所在的位置)和app.yaml(在GCP中运行它所需的配置文件)。 这是适用于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。 要使用请求,我们需要使用供应商说明安装请求和request-toolbelt。 (https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#installing_a_library)。 基本上,我们需要安装自定义库。

  1. 创建一个目录来存储您的第三方库,例如lib / mkdir lib
  2. 从您的系统上下载requests和requests-toolbelt库,或将它们直接下载到先前步骤中创建的lib文件夹中。
  3. 使用带有-t标志的pip(版本6或更高版本)将库复制到上一步中创建的文件夹中。例如: pip install -t lib /(pip install -t lib /请求)
  4. 在与app.yaml文件相同的文件夹中创建一个名为appengine_config.py的文件。
  5. 编辑appengine_config.py文件,并将您的库目录提供给vendor.add()方法。 示例appengine_config.py文件

    来自google.appengine.ext导入供应商

    添加所有安装在“ lib”文件夹中的库。

    vendor.add('lib / requests') vendor.add('lib / requests_toolbelt')

  6. 一旦安装,请使用request_toolbelt.adapters.appengine模块配置请求以使用URLFetch。 将以下代码复制到main.py文件的开头

    导入请求 从request_toolbelt.adapters导入appengine appengine.monkeypatch(validate_certificate = True)

https://cloud.google.com/appengine/docs/standard/python/issue-requests

现在,我们可以轻松地使用请求库发出获取/发布请求。 测试您的应用程序:

dev_appserver.py --port=<port number> app.yaml