Google应用引擎任务队列和用户服务

时间:2011-08-11 21:44:28

标签: google-app-engine task-queue

我正在使用python和Google应用引擎。我想使用任务队列。作为任务队列处理程序的一部分,我检查当前用户是否是管理员(使用用户服务)。此测试总是失败。有没有办法让这个测试通过?

更新:为了避免进一步的混淆,我试图找出触发任务的用户是否是管理员(这只是一个简单的例子)。我知道该任务正在从服务器运行,所有用户cookie早已不复存在。所以我正在努力的答案是将会话转移到任务

的方法
import logging
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import taskqueue

class MyRequesHandler(webapp.RequestHandler):
    def get(self):
        taskqueue.add(url="/task/")

class MyTaskHandler(webapp.RequestHandler):
    def post(self):
        if users.is_current_user_admin():
            logging.debug("admin")
        else:
            logging.debug("not admin")


def main():
    logging.getLogger().setLevel(logging.DEBUG)
    application = webapp.WSGIApplication([
            ('/', MyRequesHandler),
            ('/task/', MyTaskHandler)
        ],
        debug=True)
    run_wsgi_app(application)

3 个答案:

答案 0 :(得分:5)

Users API反映了当前请求的登录用户的详细信息,显然在任务队列任务的情况下,没有用户,因为它是由任务队列系统启动的。在排队任务之前,您需要执行此检查,并将结果作为标志传递给任务。

答案 1 :(得分:1)

要在某些特定事件上代表执行任务,只需将数据存储区ID或密钥(或用户的任何其他标识符)作为其有效负载传输到任务。

class MyRequesHandler(webapp.RequestHandler):
    def get(self):
        taskqueue.add(url="/task/do_something", params={'user_email': users.get_current_user().email()})

class MyTaskHandler(webapp.RequestHandler):
    def post(self):
        user_email = self.request.POST.get('user_email')
        user = User.all().filter('email', user_email).get()
        # ... do something on behalf of user

这显然需要保护任务的URL免受外部未经授权的访问 - 这可以在app.yaml中完成:

handlers:
    - url: /task/(.*)
      script: tasks.py
      login: admin

任务队列访问需要管理员登录的网址没有问题。

答案 2 :(得分:0)

执行任务队列项时,无法通过用户服务使用原始用户。但是,在创建任务时,您可以将原始用户的ID包含在请求中。

要防止外部用户在任务执行期间伪造此用户ID,请查找X-AppEngine-QueueName请求标头。此标头为only present on task queue items,无法由外部用户伪造。