Python装饰器做了什么,它的代码在哪里?

时间:2012-09-23 13:23:49

标签: python django decorator login-required

  

可能重复:
  Understanding Python decorators

Python装饰器有什么作用?在向方法添加装饰器时,我在哪里可以看到正在运行的代码?

例如,当我在方法顶部添加@login_required时,是否有任何代码替换该行?该行究竟如何检查用户会话?

3 个答案:

答案 0 :(得分:4)

  

当我在方法顶部添加@login_required时,是否有任何代码替换该行?

有点儿。在视图函数之前添加@login_required与执行此操作具有相同的效果:

def your_view_function(request):
    # Function body

your_view_function = login_required(your_view_function)

有关Python中装饰器的解释,请参阅:

所以装饰器函数接受原始函数,并返回一个函数(可能)调用原始函数,但也执行其他操作。

login_required的情况下,我认为它检查传递给视图函数的请求对象,以查看用户是否经过身份验证。

答案 1 :(得分:0)

装饰器实际上是一个包装另一个函数或类的函数。您案例中装饰器背后的功能名为login_required。查看您的导入以找到它。

答案 2 :(得分:0)

装饰器是一个包装另一个功能的功能。假设你有一个函数f(x)并且你有一个装饰器h(x),装饰器函数将你的函数f(x)作为参数,所以你将拥有的是一个新函数h(f(x)) 。它使得代码更清晰,例如在您的login_required中,您不必输入相同的代码来测试用户是否已登录,而是可以将该函数包装在login_required函数中,以便只有在用户已登录。请在下面研究此片段

def login_required(restricted_func):
"""Decorator function for restricting access to restricted pages.
Redirects a user to login page if user is not authenticated.
Args:
    a function for returning a restricted page
Returns:
    a function 
"""
def permitted_helper(*args, **kwargs):
    """tests for authentication and then call restricted_func if
    authenticated"""
    if is_authenticated():
        return restricted_func(*args, **kwargs)
    else:
        bottle.redirect("/login")
return permitted_helper