Очередь задач Google App Engine и служба пользователей

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

update: Чтобы избежать дальнейшей путаницы, я пытаюсь выяснить, был ли пользователь, запустивший задачу, администратором или нет (это всего лишь простой пример). Я так понимаю, что задача запускается с сервера и все куки пользователей давно пропали. Итак, ответ, на который я надеялся, был способом перенести сеанс на задачу

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)

person rp90    schedule 11.08.2011    source источник


Ответы (3)


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

person Nick Johnson    schedule 11.08.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

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

person Xion    schedule 12.08.2011

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

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

person mndrix    schedule 18.03.2014