使用蓝图中的EVE事件挂钩¶
保罗·弗雷克斯
烧瓶的使用 Blueprints 帮助我们使用不适合作为典型EVE资源的新端点扩展EVE应用程序。将这些端点拉出EVE范围允许我们编写特定的代码来处理特定的情况。
在蓝图的上下文中,我们可以预期EVE功能不可用,但通常情况并非如此。我们可以继续使用一系列功能,例如 事件钩子 .
下一个代码段显示 users
模块有一个蓝图,它执行一些自定义操作,然后使用 users_deleted
通知和调用注册到EVE应用程序的所有回调函数的信号。
from flask import Blueprint, current_app as app
blueprint = Blueprint('prefix_uri', __name__)
@blueprint.route('/users/<username>', methods=['DELETE'])
def del_user(username):
# some specific code goes here
# ...
# call Eve-hooks consumers for this event
getattr(app, "users_deleted")(username)
下一个片段显示了蓝图是如何绑定到我们的主EVE应用程序上的,以及 set_username_as_none
函数注册为在每次使用EVE事件删除用户时调用,以更新正确的MongoDB集合。
from eve import Eve
from users import blueprint
from flask import current_app, request
def set_username_as_none(username):
resource = request.endpoint.split('|')[0]
return current_app.data.driver.db[resource].update(
{"user" : username},
{"$set": {"user": None}},
multi=True
)
app = Eve()
# register the blueprint to the main Eve application
app.register_blueprint(blueprint)
# bind the callback function so it is invoked at each user deletion
app.users_deleted += set_username_as_none
app.run()