1

我有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重定向时在函数中使用该变量,以便用户在登录后被重定向回同一页面。

4

2 回答 2

3

create_login_url函数将目标 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
于 2012-05-20T17:04:57.047 回答
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等。

于 2012-05-20T17:05:01.977 回答