Очередь задач Google App Engine и служба поддержки пользователей - PullRequest
2 голосов
/ 12 августа 2011

Я использую Python и Google App Engine.Я хотел бы использовать очередь задач.Как часть обработчика очереди задач я проверяю, является ли текущий пользователь администратором (используя службу «Пользователи»).Этот тест всегда терпит неудачу.Есть ли способ заставить этот тест пройти?

обновление: чтобы избежать дальнейшей путаницы, я пытаюсь выяснить, был ли пользователь, который вызвал задачу, администратором или нет (это простой пример).Я понимаю, что задача запускается с сервера, и все файлы 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 ]

5 голосов
/ 12 августа 2011

Пользовательский API отражает подробности вошедшего в систему пользователя для текущего запроса, и, очевидно, в случае задачи очереди задач пользователь отсутствует, поскольку он инициируется системой очереди задач.Вам нужно будет выполнить эту проверку, прежде чем ставить задачу в очередь, и вместо этого передать результат в виде флага.

1 голос
/ 12 августа 2011

Чтобы задача выполнялась от имени какого-то конкретного лица, просто передайте идентификатор хранилища данных или ключ (или любой другой идентификатор пользователя) задаче в качестве полезной нагрузки.

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

У Taskqueue нет проблем с доступом к URL-адресам, требующим входа администратора.

0 голосов
/ 18 марта 2014

Исходный пользователь недоступен через службу users при выполнении элементов очереди задач. Однако при создании задачи вы можете включить в запрос исходный идентификатор пользователя.

Чтобы внешние пользователи не могли фальсифицировать этот идентификатор пользователя во время выполнения задачи, найдите заголовок запроса X-AppEngine-QueueName. Этот заголовок присутствует только в элементах очереди задач и не может быть подделан внешними пользователями.

...