如何用装饰器让函数在所有Flask API端点自动执行?
实现Flask所有API端点自动执行指定函数的方案
你可以通过自定义装饰器或者Flask内置的请求钩子来实现这个需求,两种方案各有适用场景,下面分别说明:
方案一:自定义装饰器(符合你的期望结构)
直接实现你想要的@do_something_was_called装饰器,让每个视图函数执行前自动调用do_something:
from flask import Flask app = Flask(__name__) def do_something(): # 这里写你的业务逻辑 print("执行了do_something") # 自定义装饰器实现 def do_something_was_called(func): def wrapper(*args, **kwargs): # 先执行指定函数 do_something() # 再执行原视图函数 return func(*args, **kwargs) return wrapper # 按你的期望结构使用装饰器 @do_something_was_called @app.route('/route1', methods=['GET']) def my_function(): return "200 OK" @do_something_was_called @app.route('/route2', methods=['GET']) def my_other_function(): return "200 OK" if __name__ == '__main__': app.run()
注:原代码里的@app.route参数需加引号,Method应为小写复数methods,示例中已修正这些语法问题。
方案二:全局请求钩子(无需逐个加装饰器)
如果需要所有API端点都自动执行do_something,推荐用Flask内置的before_request钩子,一次配置全局生效,彻底避免遗漏:
from flask import Flask app = Flask(__name__) def do_something(): # 这里写你的业务逻辑 print("执行了do_something") # 注册全局前置请求钩子 @app.before_request def before_request_handler(): do_something() # 正常定义路由即可,无需额外装饰器 @app.route('/route1', methods=['GET']) def my_function(): return "200 OK" @app.route('/route2', methods=['GET']) def my_other_function(): return "200 OK" if __name__ == '__main__': app.run()
两种方案对比
- 装饰器方案:适合需要选择性给部分端点添加逻辑的场景,灵活可控,但需逐个给视图加装饰器,仍有遗漏风险。
- 全局钩子方案:适合所有端点都需要执行的场景,一次配置全局生效,彻底避免遗漏问题。
内容的提问来源于stack exchange,提问作者question10101
相关产品推荐
相关产品推荐

