如何在flask中使用Python生成器
每次我请求FlaskAPI时,我都希望得到递增的值。但我总是得到相同的值,因为如何在flask中使用Python生成器,python,flask,generator,Python,Flask,Generator,每次我请求FlaskAPI时,我都希望得到递增的值。但我总是得到相同的值,因为series()对象被一次又一次地创建 我已经制作了FlaskAPI和生成器函数 @app.route('/eRxBot/Increment', methods=['POST','GET']) def Gen(): gen =series() val =str(next(gen)) print(val) res = Response(val)
series()
对象被一次又一次地创建
我已经制作了FlaskAPI和生成器函数
@app.route('/eRxBot/Increment', methods=['POST','GET'])
def Gen():
gen =series()
val =str(next(gen))
print(val)
res = Response(val)
return res
def series():
for i in range(1,999):
yield i
输出:
1
2
3
依此类推,每次API调用都会递增。您看到的问题是,您正在为每个HTTP请求创建一个新的series generator实例。通过将生成器实例移到view函数之外,它将随着每个请求而增加 但是,状态不会在应用程序重启期间存储,也不会在需要备份数据存储的多个进程之间同步 下面是一个工作版本和一个使用Redis支持值生成而不是本地生成器的示例。 编辑:对于附加问题,现在,对于基于生成器的示例,该系列每天重置
from flask import Flask, Response
from flask_redis import FlaskRedis
import datetime
app = Flask(__name__)
redis_store = FlaskRedis(app)
redis_key = "my_incr"
def series():
for i in range(1, 999):
yield i
def make_get_or_rotate_series():
today = datetime.date.today()
current_series = series()
def get_or_rotate_series(current_day=None):
nonlocal today, current_series
current_day = current_day if current_day else datetime.date.today()
if today != current_day:
today = current_day
current_series = series()
return current_series
return get_or_rotate_series
get_series = make_get_or_rotate_series()
@app.route('/eRxBot/Increment', methods=['POST', 'GET'])
def gen():
val = str(next(get_series()))
print(val)
res = Response(val)
return res
@app.route('/eRxBot/Increment-Redis', methods=['POST', 'GET'])
def gen_redis():
val = redis_store.incr(redis_key)
res = Response(str(val))
return res
if __name__ == "__main__":
# tests
test_get_series = make_get_or_rotate_series()
assert next(test_get_series()) == 1
assert next(test_get_series()) == 2
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
assert next(test_get_series(tomorrow)) == 1
assert next(test_get_series(tomorrow)) == 2
app.run()
似乎您不知道什么是restful,请看以下内容:如果您试图在每次API调用中递增,则不会发生这种情况,因为状态不会跨调用存储。如果你想做到这一点,可以使用类似session的方法,但在休息原则方面,这似乎是一个非常糟糕的做法。你真正想要完成的是什么?谢谢史蒂夫·麦卡特尼,它工作得很好。