如何在Flask中使用Python Generator

时间:2019-04-17 07:53:05

标签: python flask generator

每次我请求烧瓶API时,我都想获得增量值。但是我总是得到相同的值,因为pass对象一次又一次地被创建。

我已经制作了烧瓶API和生成器函数。

// app.component.ts
constructor(private router: Router) {
  // reset routes
  router.resetConfig(routes);
}

输出:

<div *ngIf="myFlag != null; elseCondition"> <ion-button expand="block" fill="outline"color="success" (click)="navigate(id)">Flight route</ion-button> </div> <ng-template #elseCondition> No data </ng-template> series() @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

,依此类推,每次API调用都会增加。

1 个答案:

答案 0 :(得分:1)

您看到的问题是您正在为每个HTTP请求创建系列生成器的新实例。通过将生成器的实例移到视图函数之外,它将随每个请求而增加。

但是,状态不会在应用程序的重新启动之间存储,也不会在需要支持数据存储的多个进程之间进行同步。

这是一个工作版本,是使用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()