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))

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。
***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.con 原创,没有猿人学授权,请勿以任何形式转载。***
说点什么吧...