Gev*_*ous 6 python signals flask
我正在忙着用烧瓶视图在烧瓶中编写一个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"
Run Code Online (Sandbox Code Playgroud)
我想将信号连接代码移动到my_blueprint中,但是找不到优雅地做到这一点的方法.我怎样才能做到这一点?
请记住,Python 中的装饰器语法是糖:
@decorator
def decorated():
pass
Run Code Online (Sandbox Code Playgroud)
相当于:
def decorated():
pass
decorated = decorator(decorated)
Run Code Online (Sandbox Code Playgroud)
因此,您可以print_howdy在蓝图中定义并将其与蓝图一起导入。为了保持整洁,您甚至可以在蓝图中定义一个信号侦听器列表,然后一次性将它们全部导入:
mysignal.connect_via(app)(print_howdy)
Run Code Online (Sandbox Code Playgroud)
甚至:
# 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)
Run Code Online (Sandbox Code Playgroud)
您甚至可以将此模式抽象为一个函数:
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)
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用:
app = Flask(__name__)
register_blueprint_and_signals(app, "my_module.my_blueprint")
register_blueprint_and_signals(app, "another.blueprint", ['ANOTHERSIGNAL'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1998 次 |
| 最近记录: |