GAE TaskQueue:从App Engine外部访问拉取队列的示例代码?

时间:2011-08-06 07:30:05

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

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

  • 是否有图书馆为我这样做?

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

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

3 个答案:

答案 0 :(得分:4)

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

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

在采用此路线之前,您还可以选择滚动自己的安全性,并为appengine taskqueue调用创建一个简单的Web包装器。在处理完这个问题之后我很想走这条路,但是因为这个工作我现在正在使用它。

设置您的计算机

设置帐户

  • 使用Google Cloud Console,创建一个已注册的应用程序(如果您还没有。点击您的AppEngine项目 - > API和auth - >已注册的应用程序。您可以输入名称和应用程序类型然后接受默认值。创建后,请记下客户端ID和客户端密钥以供日后使用。

  • 同时更新您的同意屏幕(API和身份验证 - >同意屏幕)。请注意,您只需要此同意屏幕即可首次设置您的oauth凭据。您需要输入电子邮件地址和产品名称(我也输入了HomePage Url)。

生成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 Cloud Console,创建一个已注册的应用程序(如果您还没有。点击您的AppEngine项目 - &gt; API&amp; Auth - &gt;凭据。单击创建新客户端ID,指定服务帐户,然后单击“创建客户端ID”。 将弹出一个下载框以下载您的私钥,将其保存到您的代码目录(或者保存为client_key.p12的任何地方)。在Web界面上,记下客户端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')

答案 1 :(得分:1)

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

答案 2 :(得分:0)

pull队列页面有whole section个客户端库和示例代码。