You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用装饰器让函数在所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:15:33