使用蓝图中的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()