【问题标题】:Blueprint initialization, can I run a function before first request to blueprint蓝图初始化,我可以在第一次请求蓝图之前运行一个函数吗
【发布时间】:2014-12-09 18:20:40
【问题描述】:

是否可以在第一次请求特定blueprint 之前运行函数?

@my_blueprint.before_first_request
def init_my_blueprint():
    print 'yes'

目前这将产生以下错误:

AttributeError: 'Blueprint' object has no attribute 'before_first_request'

【问题讨论】:

  • 您可以在应用中调用register_blueprint 后立即运行任何需要的代码。

标签: flask flask-script


【解决方案1】:

蓝图等价物称为@Blueprint.before_app_first_request

@my_blueprint.before_app_first_request
def init_my_blueprint():
    print('yes')

名称反映了它在任何请求之前被调用,而不仅仅是此蓝图特定的请求。

只有第一个请求由您的蓝图处理,运行代码没有挂钩。您可以使用 @Blueprint.before_request handler 来模拟它是否已运行:

from threading import Lock

my_blueprint._before_request_lock = Lock()
my_blueprint._got_first_request = False

@my_blueprint.before_request
def init_my_blueprint():
    if my_blueprint._got_first_request:
        return
    with my_blueprint._before_request_lock:
        if my_blueprint._got_first_request:
            return

        # first request, execute what you need.
        print('yes')

        # mark first request handled *last*
        my_blueprint._got_first_request = True

这模仿了 Flask 在这里所做的事情;需要锁定,因为单独的线程可能会争先恐后地抢占先机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多