我有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
函数,以便用户在登录后重定向回同一页面。
答案 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
等技巧。