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.com 原创,没有猿人学授权,请勿以任何形式转载。***