Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在flask中使用Python生成器_Python_Flask_Generator - Fatal编程技术网

如何在flask中使用Python生成器

如何在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)

每次我请求FlaskAPI时,我都希望得到递增的值。但我总是得到相同的值,因为
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的方法,但在休息原则方面,这似乎是一个非常糟糕的做法。你真正想要完成的是什么?谢谢史蒂夫·麦卡特尼,它工作得很好。