繁体   English   中英

在Flask Blueprint中捕获信号

[英]Catch signals in Flask Blueprint

我正在忙着用烧瓶视图在烧瓶中编写一个RESTful API来驱动API。 由于应用程序很大,我将代码模块化为蓝图。 我试图捕捉蓝图中的信号时遇到了一些麻烦。 我很乐意在我的主__init__.py文件中编写'连接信号'代码,但我想在相关的蓝图中编写信号监听器,以免主要的create_app方法混杂蓝图特定的代码。

目前我有这个[简化]工作代码:

def create_app(debug=False):
    app = Flask(__name__)
    ...
    app.register_blueprint(my_blueprint)
    @mysignal.connect_via(app)
    def print_howdy(sender, **extra):
       print "howdy"

我想将信号连接代码移动到my_blueprint中,但是找不到优雅地做到这一点的方法。 我怎样才能做到这一点?

请记住,Python中的装饰器语法是糖:

@decorator
def decorated():
    pass

相当于:

def decorated():
    pass

decorated = decorator(decorated)

因此,您可以在蓝图中定义print_howdy并将其与蓝图一起导入。 为了保持清洁,您甚至可以在蓝图中定义信号监听器列表并将其全部导入:

mysignal.connect_via(app)(print_howdy)

甚至:

# blueprint.py
def print_howdy(): pass
def print_seeya(): pass

MYSIGNAL_LISTENERS = (print_howdy, print_seeya)

# __init__.py
from blueprint import MYSIGNAL_LISTENERS
for listener in MYSIGNAL_LISTENERS:
    mysignal.connect_via(app)(listener)

您甚至可以将此模式抽象为函数:

from werkzeug.utils import import_string

DEFAULT_SIGNALS = ('MYSIGNAL', 'MYOTHERSIGNAL')

def register_blueprint_and_signals(app, bp_path, signals=DEFAULT_SIGNALS):
    bp = import_string(bp_path)
    app.register_blueprint(bp)


    signal_path = bp_path.rsplit(".", 1)[0] + "."
    for signal in signals:
        try:
            listeners = import_string(signal_path + signal + '_LISTENERS')
        except ImportError:
            continue

        for listener in listeners:
            signal.connect_via(app)(listener)

你可以这样使用:

app = Flask(__name__)
register_blueprint_and_signals(app, "my_module.my_blueprint")
register_blueprint_and_signals(app, "another.blueprint", ['ANOTHERSIGNAL'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM