最近在一个项目中,需要判断 restful 接口函数传入的时候,是否之前已经登录状态是某个特定用户,以及该用户有没有指定的权限。检查下来如果没有的话,立刻返回错误,中断功能。
遮掩的场景虽然也可以通过标准的调用函数来操作,但都不如用装饰器来得简单。都知道装饰器好用不好写,废话不说,先来看看这个场景怎么实现,还是有一定的通用性的。
def validate_current_is_admin(f):
@functools.wraps(f)
def decorated_function(*args, **kws):
# 需要在登录状态调用, 检查是否为有admin权限的用户登录,
# 如果不是,返回错误码;
if g.user.user_name != 'admin':
raise CustomFlaskErr(USER_MUST_HAS_ADMIN_PRIVILEGE, status_code=401)
# 验证权限是否为 admin, 不是的话,返回401错误
if g.user.role_id != Permission.ADMIN:
raise CustomFlaskErr(USER_MUST_HAS_ADMIN_PRIVILEGE, status_code=401)
return f(*args, **kws)
return decorated_function
这是一个标准的装饰器的写法,如果你要写一个简单的装饰器,整个框架可以参考。
装饰器调用举例:
@app.route('/api/create_user', methods=['POST'])
@auth.login_required
@validate_current_is_admin
def create_user():
# 获得参数
user_name = request.json.get('user_name')
password = request.json.get('password')
......
核心代码的业务逻辑也不复杂,根据 flask 的 g 对象中预存的用户 user 进行检查处理,flask 的这些定义非常灵活,flask.g
怎么使用可以查看 flask 的文档。
这里的user
以及相关的属性属于具体业务逻辑,就不展开解释了,可以望文生义。
如果检查下来不符合的话,会调用自定义的 flask 错误,这部分内容可以查看之前写的 python flask 写 api 如何返回自定义错误。
因为不对args
和kws
这些参数进行解析和处理,所处理的是 flask 全局对象。最后将参数都原路打包返回即可,没有问题的话交给使用装饰器的代码继续处理。
这个例子比较简单,主要还是熟悉装饰器的基本用法。
网友评论