[python] [flask] 使用技巧(一) 使用before_request来做权限和用户检查

本文介绍了一种在RESTful API中实现权限管理的方法。通过在请求前检查JWT等认证密钥,可以有效地验证用户身份并控制对特定API的访问。此外,还可以进行IP地址检查以阻止受限IP的访问。

因为使用restful方式,因此每次用户访问都会上传带入auth_key,如jwt等,因此可在@app.before_request中做权限的检查。

@app.app.before_request
def before_request():
    #可在此处检查jwt等auth_key是否合法,
    #abort(401)
    #然后根据endpoint,检查此api是否有权限,需要自行处理
    #print(["endpoint",connexion.request.url_rule.endpoint])
    #abort(401)
    #也可做ip检查,以阻挡受限制的ip等
这样,可对权限做集中管理


### Flask `before_request_funcs` 使用方法及实现机制 #### 1. **定义与作用** 在 Flask 中,`before_request_funcs` 是个列表,用于存储那些需要在每次 HTTP 请求到达之前执行的函数。这些函数通常用来完成些全局性的初始化工作,比如验证用户身份、设置上下文变量或者记录日志等。 当开发者调用装饰器 `@app.before_request` 或者类视图中的同名方法时,实际上是在向该列表追加相应的回调函数[^2]。 #### 2. **具体实现机制** 以下是 Flask 对于 `before_request` 装饰器的核心实现逻辑: ```python def before_request(self, f): """Registers a function to run before each request.""" self.before_request_funcs.append(f) return f ``` 这段代码表明,每当有新的函数通过 `@app.before_request` 注册时,它会被直接加入到 `self.before_request_funcs` 列表中。随后,在处理每次请求的过程中,Flask 会依次调用此列表内的所有函数。 完整的请求生命周期可以描述如下: - 当客户端发起请求后,Flask 首先查找并运行所有的 `before_request` 函数; - 如果某个 `before_request` 返回了个响应对象,则后续的视图函数不会被执行,而是立即返回给客户端; - 若无任何异常发生且未提前终止流程,则继续进入路由匹配阶段以及对应的视图函数执行过程。 #### 3. **实际应用案例** 下面提供段具体的例子来说明如何利用 `before_request` 进行请求拦截操作: ```python from flask import Flask, g, abort app = Flask(__name__) @app.before_request def check_user(): user_id = get_current_user_id() # 假设这是获取当前用户的某种方式 if not is_valid(user_id): # 同样假设存在这样的校验功能 abort(403) def get_current_user_id(): pass # 实现省略 def is_valid(user_id): pass # 实现省略 if __name__ == "__main__": app.run() ``` 在这个实例里,我们定义了个名为 `check_user` 的前置钩子函数,它的职责在于确认访问者的合法性。如果发现非法情况,则立刻中断整个请求链路并向外部反馈状态码 403 (Forbidden)[^2]。 #### 4. **注意事项** 尽管 `before_request` 提供了强大的灵活性,但在使用过程中也需要注意以下几点事项: - 所有的 `before_request` 处理程序都必须快速高效以免拖慢整体性能。 - 它们无法区分不同的端点(endpoint),因此可能需要额外编写条件分支来进行针对性控制。 - 不要忘记错误处理部分,因为旦抛出未经捕获的异常可能会导致服务崩溃。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值