【问题标题】:GAE TaskQueue: Sample code for accessing pull queue from outside App Engine?GAE TaskQueue:从 App Engine 外部访问拉取队列的示例代码?
【发布时间】:2011-08-06 07:30:05
【问题描述】:

我正在尝试使用 GAE TaskQueue 的 REST API 将任务从队列拉到外部服务器(不在 GAE 上的服务器)。

  • 有没有图书馆可以为我做这件事?

  • API 很简单,所以我只需要弄清楚身份验证。我使用--dump_request检查了gtaskqueue_samplegoogle-api-python-client发送的请求,发现authorization: OAuth XXX标头。将该令牌添加到我自己请求的工作中,但该令牌似乎会定期(可能每天)过期,我不知道如何重新生成它。就此而言,gtaskqueue_sample 本身不再有效(对https://accounts.google.com/o/oauth2/token 的调用失败并显示No JSON object could be decoded)。

如何处理身份验证?这是一个服务器应用程序,因此理想情况下我可以生成一个以后可以使用的令牌。

【问题讨论】:

    标签: python google-app-engine task-queue


    【解决方案1】:

    这个问题很老了,但它仍然适用,所以我将根据我最近的经验尝试一个更好的答案。

    可以在 appengine 之外访问拉取任务队列,但正如提问者所说,没有好的示例,所以这里有一个更深入的指南。就我而言,我有一个自定义 python 脚本需要轮询队列以运行新作业。

    在采用此方法之前,您还可以选择滚动自己的安全性并为 appengine 任务队列调用制作一个简单的 Web 包装器。处理完这个问题后,我很想走那条路,但由于这行得通,我现在正在使用它。

    设置您的机器

    设置您的帐户

    • 使用Google Cloud Console,创建一个已注册的应用程序(如果您还没有的话。点击您的 AppEngine 项目 -> API 和授权 -> 已注册的应用程序。您可以输入名称和应用程序类型,然后接受默认值。创建后,请记下 Client Id 和 Client Secret 以备后用。

    • 同时更新您的同意屏幕(API 和授权 -> 同意屏幕)。请注意,首次设置您的 oauth 凭据时,您只需要此同意屏幕。您需要输入电子邮件地址和产品名称(我也输入了主页网址)。

    生成 OAuth 凭据

    • 您只需要生成一次凭证文件,然后它将用于您的 python 脚本中的未来调用。运行这个打开浏览器并生成凭证文件的 python 代码。此代码的参考是here

      from oauth2client.tools import run
      from oauth2client.client import OAuth2WebServerFlow
      from oauth2client.file import Storage
      import gflags
      FLAGS = gflags.FLAGS
      
      storage = Storage('credentials.json')
      
      flow = OAuth2WebServerFlow(client_id='<your_client_id>',
                             client_secret='<your_client_secret>',
                             scope='https://www.googleapis.com/auth/taskqueue',
                             redirect_uri='urn:ietf:wg:oauth:2.0:oob')
      
      credentials = run(flow, storage )
      

    调用任务队列

    • 确保您已在 AppEngine queue.yaml 中添加了一个拉取队列,其中包含您在上述 oauth 步骤中使用的电子邮件地址。

      from oauth2client.tools import run
      from oauth2client.client import OAuth2WebServerFlow
      from oauth2client.file import Storage
      from apiclient.discovery import build
      import httplib2
      
      storage = Storage('credentials.json')
      credentials = storage.get()
      http = httplib2.Http()
      http = credentials.authorize(http)
      task_api = build('taskqueue', 'v1beta2')
      tasks = task_api.tasks().lease(project='<your appengine project>',taskqueue='<pull queue name>', numTasks=1, leaseSecs=600).execute(http=http)
      task = tasks['items'][0]
      payload = task['payloadBase64']
      payload = base64.b64decode(payload)
      
      #then do your work and delete the task when done
      
      task_api.tasks().delete(project='s~<your appengine project>',taskqueue='<pull queue name>', task=task['id']).execute(http=http)
      
    • 任务队列API Reference

    • 注意删除调用中项目名称前的前缀“s~”。只有当我添加它并且我相信它是 bug 时它才会起作用。

    2014 年 7 月 1 日更新

    所以实际上有一种更简单的方法来进行服务器到服务器的调用。这种方式不需要您使用“流程”(登录到 google)来获取访问密钥。

    设置您的机器

    设置您的帐户

    • 使用Google Cloud Console,创建一个已注册的应用程序(如果您还没有的话。点击您的 AppEngine 项目 -> API's & Auth -> 凭据。点击创建新客户端 ID,指定服务帐户,然后点击创建客户端ID。 将弹出一个下载框以下载您的私钥,将其保存到您的代码目录(或任何地方,我保存为 client_key.p12)。在网络界面上,记下客户 ID 和电子邮件。

    替换上面的凭证代码

    from oauth2client.client import SignedJwtAssertionCredentials
    
    email = '<***>.gserviceaccount.com'
    f = file('client_key.p12', 'rb')
    key = f.read()
    f.close()
    credentials = SignedJwtAssertionCredentials(email,
                                                key,
                                                scope='https://www.googleapis.com/auth/taskqueue')
    

    【讨论】:

    • 您的回答中的服务帐户部分对我非常有用!我从我的拉队列中租用一个任务。谢谢。
    【解决方案2】:

    这些 APIS 仅适用于 GAE 服务器,因为队列只能通过 queue.yaml 创建,而事实上 API 不公开任何用于插入队列和任务或项目的 API。

    【讨论】:

      【解决方案3】:

      拉取队列页面有一个关于客户端库和示例代码的whole section

      【讨论】:

      • @Parand 如果您对示例代码中的某些特定内容感到困惑或需要帮助,那么您应该针对它们提出具体问题。
      • 思考:示例代码使用了各种 google 约定(例如 gflags),增加了学习曲线和行李量。它不是作为可重用库呈现的(例如,凭据在客户端中是硬编码的)。它是大量代码和示例的一部分,因此更难查找和导航。例如,如果对如何使用 python-oauth2 进行身份验证有一个简单、清晰的解释,那就太好了。什么是 OAuth 端点,范围是什么意思,等等。我猜所有的信息都是零散的,但是尽管我付出了很多努力,但我还没有组装所有这些。
      • @Parand 够公平的。我会将它添加到我的博客帖子队列中。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      相关资源
      最近更新 更多