def admin_login(f): """ 登录装饰器 """ @wraps(f) def decorated_function(*args, **kwargs): # print('session', session) if "admin" not in session: return redirect(url_for("admin.login", next=request.url))
时间: 2023-06-13 21:08:09 浏览: 125
这是一个用于 Flask web 应用的装饰器函数,用于保护需要管理员权限才能访问的页面或函数。该装饰器函数的作用是检查当前会话 session 中是否存在管理员用户,如果存在则继续执行原函数,否则将页面重定向到管理员登录页面,并将当前页面的 URL 作为参数传递给登录页面,以便登录后可以跳转回来。其中,@wraps(f) 是一个装饰器,用于将原函数的元信息(如函数名、参数列表等)复制到装饰后的函数中,以保证装饰后的函数与原函数在使用上没有差别。
相关问题
解释@wraps的用法
@wraps 是 Python 标准库中的一个装饰器,它的作用是将被装饰的函数的元信息(如函数名、文档字符串、参数列表等)复制给装饰器函数的返回值,从而使得装饰器函数的调用者在使用被装饰的函数时能够看到原始函数的元信息。
简单来说,@wraps 装饰器的作用就是将被装饰函数的函数签名复制到装饰器函数上,从而保留被装饰函数的元数据,使得装饰之后的函数在使用上和原函数没有区别。
例如,如下简单的装饰器代码演示了 @wraps 装饰器的使用方法:
```python
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('Calling decorated function...')
return func(*args, **kwargs)
return wrapper
@my_decorator
def greet(name):
"""Greet someone by name."""
print(f'Hello, {name}!')
print(greet.__name__)
# Output: greet
print(greet.__doc__)
# Output: Greet someone by name.
```
在这个例子中,我们定义了一个装饰器函数 `my_decorator`,使用 @wraps 装饰器将被装饰函数的元信息复制到 `wrapper` 函数上。然后,我们将 `greet` 函数用 `@my_decorator` 修饰,这样调用 `greet` 函数时,其元信息就能够被保留下来了。
最后,我们打印 `greet` 函数的名称和文档字符串,可以看到它们都是被装饰函数 `greet` 的名称和文档字符串,而不是装饰器函数 `wrapper` 的名称和文档字符串。
阅读全文