отслеживать входы в appengine - PullRequest
0 голосов
/ 05 января 2011

Я создаю сервис groupon-y для изучения движка приложений.Я хочу отслеживать список учетных записей, которые входят на сайт (с помощью аутентификации Google).Какой лучший способ сделать это?Поскольку я использую аутентификацию Google, нет единого момента времени, когда они «регистрируются»;они могут войти в систему по любому адресу.

Вот что я пробовал:

  • функция force_login в начале каждого отдельного обработчика запроса, который выполняет get_or_insert
  • я думаю, что мог бы подкласс @ login_required , но я все еще должен помнить, что декораторы на всех моих обработчиках запросов

не существует способа просто перехватить сразу после входа в систему, а зарегистрировать какую-то логику?

Ответы [ 3 ]

1 голос
/ 05 января 2011

Вы можете использовать декоратор - вам придется помнить, чтобы он помещался перед любыми обработчиками, которые все равно требуют входа в систему - или вы можете сделать это в базовом RequestHandler, который расширяют все ваши обработчики (мои личные предпочтения), или вы мог бы написать некоторое промежуточное программное обеспечение WSGI, которое делает это. Это зависит от вас.

0 голосов
/ 12 февраля 2011

Как бы вы написали декоратор?

Нечто похожее на [RequiresAuthentication] в .net MVC?

class Importer(webapp.RequestHandler):
    @RequiresAuthentication
    def get(self):
        pass



def RequiresAuthentication(fn):
    def authorize(self):
        if not users.get_current_user():
            self.redirect(users.create_login_url(self.request.uri))
        else:
            return fn(self)
    return authorize

Я только что проверил выше в тестовом приложении, и, похоже, оно работает.

После просмотра @login_required он не работает для сообщения:

def login_required(handler_method):
  """A decorator to require that a user be logged in to access a handler.

  To use it, decorate your get() method like this:

    @login_required
    def get(self):
      user = users.get_current_user(self)
      self.response.out.write('Hello, ' + user.nickname())

  We will redirect to a login page if the user is not logged in. We always
  redirect to the request URI, and Google Accounts only redirects back as a GET
  request, so this should not be used for POSTs.
  """
  def check_login(self, *args):
    if self.request.method != 'GET':
      raise webapp.Error('The check_login decorator can only be used for GET '
                         'requests')
    user = users.get_current_user()
    if not user:
      self.redirect(users.create_login_url(self.request.uri))
      return
    else:
      handler_method(self, *args)
  return check_login
0 голосов
/ 05 января 2011

Нет способа выполнить код сразу после входа в систему, за исключением, как вы сказали, не забудьте сделать это в начале каждого обработчика или в декораторе на каждом обработчике.Декоратор звучит как лучший вариант.

...