2011-08-06 22 views
2

我正在尝试使用GAE TaskQueue的REST API将任务从队列中拉到外部服务器(服务器不在GAE上)。GAE TaskQueue:从App Engine外部访问拉式队列的示例代码?

  • 有没有图书馆为我做这个?

  • 的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)。

如何照顾身份验证?这是一个服务器应用程序,非常理想,我可以生成一个令牌,然后可以使用该令牌。

回答

0

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

+0

@Parand如果有示例代码具体的事情,你感到困惑或需要帮助,你应该特别询问有关他们的话。 –

+1

想法:示例代码使用各种谷歌约定(如gflags),这些约定会增加学习曲线和行李数量。它不是作为可重用的库(例如。证书在客户端被硬编码)。它是大量代码和样本的一部分,因此难以找到并导航。例如,如果有一个关于如何使用python-oauth2进行身份验证的简单明确的解释,那将会很好。什么是OAuth端点,范围是什么意思,等等。我猜所有的信息都在那里,但尽管付出了很多努力,我还没有把它全部集中起来。 – Parand

+0

@Parand Fair够了。我会将它添加到我的博客帖子队列中。 :) –

1

这些API只为GAE服务器工作,因为队列只能通过queue.yaml中被创建和INFACT API不公开任何API,用于插入队列,任务或项目。

4

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

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

走这条路之前,您还可以使用您自己的安全,使一个简单的Web包装到任务队列调用AppEngine上的选项。在处理完这件事之后,我很想去那条路,但是因为这是行得通的,所以我现在使用它。

设置你的机器

设定您的帐户

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

  • 同时更新您的同意画面(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) 
    

让你TASKQUEUE呼叫

  • 确保您已在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

  • 注意在删除调用的项目名称前面的前缀的〜“。如果我添加了这个,它才会起作用,我相信这是一个bug

更新2014年7月1日

所以有实际上是让服务器到服务器的调用更简单的方法。这种方式并不要求您使用“流量”(登录到谷歌)来获取访问密钥。

设置你的机器

设定您的帐户

  • 使用Google Cloud Console,创建一个注册的应用程序(如果你还没有一个。点击您的AppEngine项目 - > API的&验证 - >证书。点击创建新客户端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') 
+0

您的答案中的服务帐户部分对我非常有用!我云从我的拉队列租赁任务。谢谢。 – hiroshi

相关问题