如何在Eve的check_auth方法中访问Flask Request对象?
解决Eve中
check_auth()无法访问请求对象的问题 我之前也碰到过一模一样的问题,Eve默认的check_auth(resource, method)签名确实只提供了资源名称和请求方法,没法直接拿到请求里的参数、Headers或者Body数据,而且事件钩子又都在它之后触发,完全赶不上验证的时机。不过好在Eve是基于Flask构建的,我们可以利用Flask的请求上下文来直接获取当前请求对象。
具体实现步骤
- 首先在你的Eve项目代码里,从Flask导入
request对象:from flask import request - 然后在你的
check_auth()方法里,直接使用request对象就能获取所有请求相关的数据了,比如:def check_auth(resource, method): # 获取请求Headers中的认证Token auth_token = request.headers.get('Authorization') # 获取GET请求的查询参数 user_id = request.args.get('user_id') # 获取POST/PUT请求的JSON格式数据 request_body = request.get_json() # 在这里编写你的数据验证逻辑 if not auth_token or validate_token(auth_token, user_id) is False: return False return True
为什么这个方法可行?
Eve运行在Flask的请求上下文环境中,当一个请求进来时,Flask会自动把当前请求实例绑定到request这个全局对象上。不管你在哪个被请求上下文覆盖的函数里(包括check_auth),都能直接访问它——这比调用current_app要直接得多,因为current_app是应用实例,而request就是你需要的当前请求实例。
注意事项
- 不用额外处理请求上下文的激活问题,Eve在处理请求的流程中会自动触发
check_auth,此时请求上下文已经处于活跃状态。 - 如果你的验证逻辑依赖请求Body这类数据,记得做好异常处理,比如判断
request.get_json()是否为None,避免因为请求格式不正确导致程序报错。
内容的提问来源于stack exchange,提问作者irhetoric
相关产品推荐
相关产品推荐

