面试题答案
一键面试请求钩子的作用
在Python Flask中,请求钩子是一种特殊的函数,允许在请求处理的不同阶段执行代码。
- before_request:在每个请求之前执行。可以用于检查用户认证、初始化数据库连接等操作。如果此函数返回一个响应对象,Flask将直接返回该响应,而不会执行视图函数。
- after_request:在视图函数执行之后,且在响应返回给客户端之前执行。可用于添加响应头、记录日志等操作。无论视图函数是否引发异常,此函数都会执行。
- teardown_request:在请求处理完成后,无论是否有异常发生,都会执行。通常用于清理资源,如关闭数据库连接。
实际项目中利用请求钩子进行操作的示例
用户认证(使用before_request)
from flask import Flask, request, abort
app = Flask(__name__)
# 模拟用户认证函数
def authenticate():
auth_header = request.headers.get('Authorization')
if not auth_header or not auth_header.startswith('Bearer '):
return False
token = auth_header.split(' ')[1]
# 这里应添加实际的token验证逻辑,例如与JWT库配合验证
if token == 'valid_token':
return True
return False
@app.before_request
def before_request_handler():
if not authenticate():
abort(401)
@app.route('/protected')
def protected():
return 'This is a protected route'
日志记录(使用after_request)
import logging
from flask import Flask, request
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
@app.after_request
def log_request(response):
logging.info(f"Request to {request.path} with method {request.method} returned {response.status_code}")
return response
@app.route('/')
def index():
return 'Hello, World!'
路由处理流程中钩子的执行顺序
- before_request:在请求进入路由处理之前首先执行。如果有多个
before_request
函数,它们将按照注册顺序依次执行。 - 视图函数:在
before_request
函数执行且不返回响应的情况下,执行视图函数来生成响应。 - after_request:视图函数成功执行后,
after_request
函数将被执行。如果有多个after_request
函数,它们将按照注册顺序逆序执行(即后注册的先执行)。 - teardown_request:无论视图函数执行过程中是否有异常,
teardown_request
函数都会在请求处理完成后执行。如果有多个teardown_request
函数,它们将按照注册顺序逆序执行。