@login_required декоратор настроенный appengine handler_method

У меня есть этот код:

def handler_method():
    users = UserModel.query(UsersModel.email == users.get_current_user().email()).fetch()
    if len(users) == 0:
        user = UsersModel(email = users.get_current_user().email())
        user.put()

class MyHandler(webapp2.RequestHandler):
    @login_required
    def get(self):
        .
        .
        my code
        .
        .

Как я могу указать декоратору @login_required метод «handler_method» в качестве действия, которое будет выполняться после успешного входа в систему?


person Fethi Dilmi    schedule 30.12.2013    source источник


Ответы (2)


Глядя на код декоратора:

def login_required(handler_method):
  """..."""
  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 

нет возможности запустить дополнительный код, если пользователь успешно вошел в систему.

Вы можете написать собственную версию декоратора, которая будет делать то, что вы хотите:

def custom_login_required(handler_method):
  """..."""
  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:
      users = UserModel.query(UsersModel.email == users.get_current_user().email()).fetch()
      if len(users) == 0:
          user = UsersModel(email = users.get_current_user().email())
          user.put()
      handler_method(self, *args)
  return check_login 
person Ryan Morlok    schedule 30.12.2013
comment
@Ryan Morlok, мы будем использовать его как декоратор над любой функцией, которую мы хотим; но что, если мы хотим передать какие-либо аргументы, такие как список ролей, например @custom_login_required(['admin','role1','role2']). и использование этого списка ролей в функции check_login В этом случае что мы будем делать? - person Saim Abdullah; 22.11.2018
comment
Все становится сложнее, когда вы хотите передать параметры декоратору, особенно если вы хотите сделать эти параметры необязательными. Есть и другие вопросы, которые касаются того, как это сделать (например, stackoverflow.com/questions/5929107 /декораторы-с-параметрами) - person Ryan Morlok; 01.12.2018

Вы должны использовать users.get_current_user(), чтобы определить, вошел ли пользователь в систему:

from google.appengine.api import users

class MyHandler(webapp2.RequestHandler):
    @login_required
    def get(self):
        if users.get_current_user():
            handler_method()
        else:
            #user not login, redirect or return 404
            pass
person Colin Su    schedule 30.12.2013
comment
Декоратор login_required будет означать, что при запуске кода всегда есть текущий пользователь. - person Greg; 30.12.2013