Python Web框架Sanic Listener – 监听器

发表时间:2020-02-18

Sanic提供的监听器(listener)允许我们在应用程序生命周期内的多个时间点运行一些代码。

Sanic Listener - 监听器

监听器分类

如果你想在Server开始时执行一些初始化代码,或者是在Server结束时执行一些清除代码,你就可以使用下面这些监听器:(和中间件一样,监听器的类型也是通过字符串参数来分类的)

  • before_server_start
  • after_server_start
  • before_server_stop
  • after_server_stop

这些中间件通过修饰器 @app.listener 修饰接受 app loop 参数的函数来实现。比如:

@app.listener('before_server_start')
async def setup_db(app, loop):
    app.db = await db_setup()

@app.listener('after_server_start')
async def notify_server_started(app, loop):
    print('Server successfully started!')

@app.listener('before_server_stop')
async def notify_server_stopping(app, loop):
    print('Server shutting down!')

@app.listener('after_server_stop')
async def close_db(app, loop):
    await app.db.close()

监听器注册方法:register_listener

除了使用修饰器还可以通过 register_listener 方法来注册监听器。这个方法的用处是,方便你在其它模块定义监视器函数,并在app所在文件进行注册。

# file: my_listener.py
async def setup_db(app, loop):
    app.db = await db_setup()
# file: app.py

from my_listener import setup_db

app = Sanic()
app.register_listener(setup_db, 'before_server_start')

Sanic add_task 方法

如果你想安排一个后台任务在事件循环开始后执行,Sanic提供了 add_task 方法来帮你轻松实现。

async def notify_server_started_after_five_seconds():
    await asyncio.sleep(5)
    print('Server successfully started!')

app.add_task(notify_server_started_after_five_seconds())

Sanic将试图自动注入 app 对象,可以作为一个参数传递给任务函数:

async def notify_server_started_after_five_seconds(app):
    await asyncio.sleep(5)
    print('Server successfully started!')

app.add_task(notify_server_started_after_five_seconds)

或者可以显式地传递 app 可以起到同样的效果:

async def notify_server_started_after_five_seconds(app):
    await asyncio.sleep(5)
    print('Server successfully started!')

app.add_task(notify_server_started_after_five_seconds(app))

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号-4
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free