Flask框架钩子函数功能与用法分析
定义
在 Flask 中,钩子函数是指在请求的不同阶段执行的函数,它可以被用于在请求被处理之前或之后添加额外的操作。Flask 框架提供了多个钩子函数,这些函数以装饰器的形式实现,可以很方便地添加到代码中。
功能与用法
钩子函数可以用于多种目的,以下列出了一些常见的用途:
身份验证
from flask import request, abort
from my_app import app
@app.before_request
def authenticate():
token = request.args.get('token')
if not token or not authenticate_token(token):
abort(401, 'Authentication failed')
上述代码中,@app.before_request
装饰器将 authenticate
函数注册为请求之前的钩子函数。authenticate
函数从 GET 请求参数中获取一个名为 token
的参数,并通过调用 authenticate_token
函数对其进行身份验证。如果身份验证失败,abort
函数将会中断当前请求,并返回 401 状态码及其对应的消息。
日志记录
import logging
from flask import request, g
from my_app import app
@app.before_request
def log_request_info():
app.logger.info('Request headers: %s', request.headers)
g.start_time = time.time()
@app.after_request
def log_request_duration(response):
duration = time.time() - g.start_time
app.logger.info('Request duration: %f', duration)
return response
上述代码中,@app.before_request
装饰器将 log_request_info
函数注册为请求之前的钩子函数。log_request_info
函数使用 Flask 自带的 logging 模块记录当前请求的头部信息,并将请求开始时间保存在 Flask 应用实例对象的 g
属性中。
@app.after_request
装饰器将 log_request_duration
函数注册为请求之后的钩子函数。log_request_duration
函数计算请求的处理时间,再次使用 logging 模块记录这个时间。
响应处理
from flask import jsonify
@app.after_request
def format_response(response):
if not response.is_json:
return response
data = response.get_json()
if 'error' in data:
response.status_code = 400
return jsonify({
'status': 'success',
'data': data,
})
上述代码中,@app.after_request
装饰器将 format_response
函数注册为请求之后的钩子函数。format_response
函数检查每个响应是否是 JSON 格式的。如果是,它将为 JSON 数据添加一个 status
键,并将原始数据放在一个 data
键下面。如果 JSON 数据包含了 error
键,format_response
函数将会将响应状态码设为 400,否则状态码维持原样。
示例
以下两个示例展示了如何使用 Flask 钩子函数:
示例 1:打印请求日志
我们可以使用 @app.before_request
和 @app.after_request
装饰器来在请求之前和之后打印请求信息和响应信息。以下是一个简单的示例:
from flask import Flask, request
app = Flask(__name__)
@app.before_request
def before_request():
print('Before request')
print('Request Path:', request.path)
print('Request Method:', request.method)
@app.after_request
def after_request(response):
print('After request')
print('Response Status Code:', response.status_code)
return response
@app.route('/')
def index():
return 'Hello world'
if __name__ == '__main__':
app.run()
示例 2:身份验证
我们可以使用 @app.before_request
装饰器来实现身份验证,以下代码展示了一个简单的示例:
from flask import Flask, request, abort
app = Flask(__name__)
def authenticate_token(token):
return token == 'mysecrettoken'
@app.before_request
def before_request():
token = request.args.get('token')
if not token or not authenticate_token(token):
abort(401)
@app.route('/')
def index():
return 'Hello world'
if __name__ == '__main__':
app.run()
在上面的示例中,我们定义了 authenticate_token
函数来验证传递的令牌值是否正确。我们使用 @app.before_request
装饰器来检查每个请求是否传递了有效的令牌值,如果不是,我们返回 401 Unauthorized 响应。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask框架钩子函数功能与用法分析 - Python技术站