Python 在不使用全局变量的情况下怎么统计方法运行次数(flask 框架中)?

flag = 0

@web.route(’/monitor’) def monitor(): “”" display all state “”" global flag flag += 1 if flag == 1: once = “initonce();” else: once = “init();”

大致代码是这样,请问怎么改可以不使用全局变量进行判断。


Python 在不使用全局变量的情况下怎么统计方法运行次数(flask 框架中)?

11 回复

在Flask里不用全局变量统计方法调用次数,可以用闭包或者类属性。闭包更Pythonic一些,这里给个完整例子:

from flask import Flask, jsonify

app = Flask(__name__)

def make_counter():
    count = 0
    def counter():
        nonlocal count
        count += 1
        return count
    return counter

# 创建计数器
view_counter = make_counter()

@app.route('/')
def index():
    current_count = view_counter()
    return f'这是第 {current_count} 次访问'

@app.route('/stats')
def stats():
    # 这里只是为了演示,实际应该用更好的方式获取当前计数
    return jsonify({'total_calls': view_counter() - 1})

if __name__ == '__main__':
    app.run(debug=True)

核心思路是make_counter函数创建了一个闭包,里面的count变量对counter函数来说是“私有”的,但又能保持状态。每次调用view_counter(),这个内部计数就会加1。

用类也可以实现,不过闭包更简洁。如果你需要在多个地方共享计数器,可以考虑用Flask的g对象或者应用上下文,但那就有点接近全局状态了。

简单说就是:用闭包封装计数状态。

Class-Based Views

Redis 之类的 kv 数据库

def counted(f):
def wrapped(*args, **kwargs):
wrapped.calls += 1
return f(*args, **kwargs)
wrapped.calls = 0
return wrapped




def foo():
print(‘1’)


foo()
foo()
foo()
foo()
foo()
foo()

print(foo.calls)

如果你的程序是多进程的或者在分布式环境下做 load balancing,上述提到的方法只有数据库可用。

.before_request 加上 随便一个文件读写或者 kv 数据库都行

啊我好像看错了…

current_app.flag = 0

回到顶部