如何将继续url传递给Login Required Decorator

时间:2012-05-20 16:49:05

标签: python google-app-engine decorator login-required

我有login_required装饰器,如下所示:

def login_required(function):
  """ Decorator to check Logged in users."""
  def check_login(self, *args, **kwargs):
    if not self.auth.get_user_by_session():
      self.redirect('/_ah/login_required')
    else:
      return function(self, *args, **kwargs)
  return check_login

现在我有一个Page(由单独的Handler呈现),我可以选择让用户上传图片,供客人和用户查看。一旦表单发布,它将由另一个使用Handler装饰器的@login_required处理。

我想要实现的是传递continue_url变量,我可以在重定向时使用check_login函数,以便用户在登录后重定向回同一页面。

2 个答案:

答案 0 :(得分:2)

create_login_url函数将目标网址作为其第一个参数。您可以从请求对象中获取dest_url。

def login_required(func):

    def _wrapper(request, *args, **kw):
        user = users.get_current_user()
        if user:
            return func(request, *args, **kw)
        else:
            return request.redirect(users.create_login_url(request.get_url()))

    return _wrapper

答案 1 :(得分:2)

所以基本上,听起来你想在使用它时将参数传递给装饰器。 Python确实支持这一点。基本思想是@decorated(argument) def foo(...)等同于def foo(...); foo = decorated(argument)(foo)

所以你需要让decorated成为decorated(argument)可以装饰foo的东西。有几个食谱。这是一个 - 使用decorated方法使__call__成为一个类,以便decorated(argument)是一个可调用对象,存储argument并在调用时使用它:

class decorator(object):
    def __init__(argument):
        self.argument = argument

    def __call__(self, wrapped):
        def wrapper(args_for_wrapped):
            do_something_with(self.argument)
            wrapped(args_for_wrapped)
            whatever_else_this_needs_to_do()
        return wrapper

这也可以通过普通函数(以及额外的嵌套级别)来实现,其中涉及functools.partial等技巧。