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 框架中)?
在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)
flask-limiter
https://flask-limiter.readthedocs.io/en/stable/
如果你的程序是多进程的或者在分布式环境下做 load balancing,上述提到的方法只有数据库可用。
.before_request 加上 随便一个文件读写或者 kv 数据库都行
啊我好像看错了…
current_app.flag = 0

