我试图只让用户" 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"可以成功添加任务吗?
答案 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