如何限制用户将任务添加到任务队列?

时间:2015-03-04 09:25:49

标签: python google-app-engine

我试图只让用户" foo"可以使用以下Google App Engine代码将任务添加到任务队列,但似乎任务失败。 (添加任务成功。)

在我设置" login:required"之前,代码有效。

的app.yaml

- url: /main.*
  script: main.app
  login: required

main.py

class ProcessHandler(webapp2.RequestHandler):
  def get(self):
    if users.get_current_user().nickname == 'foo': 
      # Do something here.
    else: 
      self.response.write('access is not allowed. ')

class TaskHandler(webapp2.RequestHandler):
  def get(self):
    q = taskqueue.Queue('myQueue')
    task_url = 'http://myapp.appspot.com/process'
    task = taskqueue.Task(url=url, method='GET')
    q.add(task)

app = webapp2.WSGIApplication([
  ('/addTask', TaskHandler),
  ('/process', ProcessHandler)
  ], debug=True)

我应该如何更改代码,以便我只允许用户" foo"可以成功添加任务吗?

1 个答案:

答案 0 :(得分:1)

url通常是相对于应用程序根目录的路径。不要包含“http://myapp.appspot.com”。

为防止用户将任务添加到队列中,而不是用户“foo”,您需要在TaskHandler代码中检查该用户。

from google.appengine.api import taskqueue

if users.get_current_user().nickname == 'foo': 
        # Add task here
        taskqueue.add(queue_name=‘myQueue’, url='/path/to/my/worker/', params={'key': key})

要阻止任何人通过点击该网址来处理任务处理程序,请添加标头以验证仅App Engine正在发出请求。

if self.request.headers.get('X-AppEngine-TaskName') is not None:
    # Process task

这些标头由Google App Engine在内部设置。如果您的请求处理程序找到任何这些标头,则它可以信任该请求是任务队列请求。如果上述任何标题存在于您的应用的外部用户请求中,则会将其删除。例外情况是来自应用程序的登录管理员的请求,允许他们为测试目的设置标头。 https://cloud.google.com/appengine/docs/python/taskqueue/overview-push