装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能,如用户验证等
@wraps(view_func)的作用:
不改变使用装饰器原有函数的结构(如name, doc)
不使用wraps可能出现的ERROR: view_func…endpoint…map..
一、用户验证装饰器,使用@wraps
# 定义登录判断装饰器
def admin_login(f):
@wraps(f)
def decorated_function(*args, **kwargs):
# session不存在时请求登录
if "admin" not in session:
return redirect(url_for("admin.login", next=request.url))
return f(*args, **kwargs)
return decorated_function
二、用户权限设置装饰器,api接口
# 权限 1查看/2可下载/4可添加 [限制接口的权限]
def check_permission_control(permission):
def check_permission(func):
def check(*args, **kwargs):
parse = parser.parse_args()
token = parse.get('token')
returndata = {}
if token: # 有token
users = User.query.filter(User.token == token)
if users.count() > 0: # 存在用户
user = users.first()
# 有无对应操作的权限
# 用户权限user: 4 100
# 接口限制权限permission: 2 010
# 接口限制权限permission: 4 100
if user.permissions & permission == permission: # 该用户有权限使用此接口
return func(*args, **kwargs)
else:
abort(403, message='你没有该操作权限,请联系管理员!')
else: # 不存在
abort(401, message='你还没有登录,请登录后操作')
else: # 无token
abort(401, message='你还没有登录,请登录后操作')
return check
return check_permission