FastAPI 中的 on_event 使用

on_event 是 FastAPI 提供的一个装饰器,用于在特定的事件发生时执行特定的代码块。这些事件通常与应用的生命周期有关,如应用启动和关闭时。使用 on_event 装饰器可以确保在应用启动或关闭时执行一些初始化或清理操作。
在 FastAPI 中,常用的事件包括应用启动 (startup) 和应用关闭 (shutdown)。除了这两个事件,FastAPI 目前只原生支持这两个事件,但它们是处理应用生命周期内重要操作的主要工具。下面我们详细讲解这两个事件及其使用场景,此外,还介绍如何使用这些事件。

常用事件

  1. startup:应用启动时触发的事件。在应用第一次接收到请求之前,startup 事件会被触发。用于进行初始化操作,比如连接数据库、加载配置、启动后台任务等。

  2. shutdown:应用关闭时触发的事件。在应用关闭或重启之前,shutdown 事件会被触发。用于执行清理操作,比如关闭数据库连接、停止后台任务、释放资源等。

使用场景及示例

1. 应用启动事件 (startup)

场景:需要在应用启动时执行一些初始化任务,比如连接数据库、加载配置或启动后台任务。

示例:在应用启动时连接到数据库,并在关闭时断开连接。

from fastapi import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

app = FastAPI()

# 创建数据库引擎和会话工厂
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

@app.on_event("startup")
async def startup_event():
    print("应用启动")
    # 初始化数据库连接
    # 例如,可以在这里运行数据库迁移操作
    # async with engine.begin() as conn:
    #     await conn.run_sync(Base.metadata.create_all)

@app.on_event("shutdown")
async def shutdown_event():
    print("应用关闭")
    # 关闭数据库连接
    # 例如,可以在这里断开数据库连接或停止后台任务
    # engine.dispose()

@app.get("/")
async def read_root():
    return {"message": "Hello World"}
2. 应用关闭事件 (shutdown)

场景:需要在应用关闭时执行清理任务,如关闭数据库连接、停止后台任务、释放占用的资源等。

示例:在应用关闭时停止后台任务。

import asyncio
from fastapi import FastAPI

app = FastAPI()

background_task = None

@app.on_event("startup")
async def startup_event():
    global background_task
    print("应用启动")
    # 启动一个后台任务
    async def background_task_func():
        while True:
            print("后台任务运行中...")
            await asyncio.sleep(5)
    background_task = asyncio.create_task(background_task_func())

@app.on_event("shutdown")
async def shutdown_event():
    print("应用关闭")
    # 停止后台任务
    if background_task:
        background_task.cancel()
        try:
            await background_task
        except asyncio.CancelledError:
            print("后台任务已停止")

@app.get("/")
async def read_root():
    return {"message": "Hello World"}

总结

FastAPI 目前主要支持 startupshutdown 两个生命周期事件,这两个事件在应用的生命周期中扮演着重要角色。使用 startup 事件可以在应用启动时进行必要的初始化工作,而使用 shutdown 事件可以在应用关闭时进行资源清理。虽然 FastAPI 只原生支持这两个事件,但它们足够处理大多数应用的初始化和清理需求。

Python FastAPI 是一个快速(高性能)且易于学习的 Web 框架,它可以与多种消息队列(MQ)进行集成,其包括 RabbitMQ。 在使用 FastAPI 和 RabbitMQ 进行集成时,你可以使用 Pika 库来连接 RabbitMQ,然后在 FastAPI 使用 FastAPI-BackgroundTasks 库来异步处理消息队列的消息。以下是一个简单的示例: 1. 安装 FastAPI 和 Pika 库: ```python pip install fastapi pip install pika pip install fastapi-background-tasks ``` 2. 在 FastAPI 应用程序导入相关库: ```python from fastapi import FastAPI, BackgroundTasks import pika ``` 3. 连接 RabbitMQ: ```python connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() channel.queue_declare(queue='my_queue') ``` 4. 编写处理函数,并在函数使用 `channel.basic_publish()` 方法将消息发布到消息队列: ```python def process_message(message): # 处理消息的代码 print("Received message:", message) def send_message_to_queue(message): channel.basic_publish(exchange='', routing_key='my_queue', body=message) ``` 5. 在 FastAPI 定义异步任务: ```python app = FastAPI() @app.post("/send_message") async def send_message(message: str, background_tasks: BackgroundTasks): background_tasks.add_task(send_message_to_queue, message) return {"message": "Message sent successfully!"} @app.on_event("startup") async def startup_event(): connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() channel.queue_declare(queue='my_queue') channel.basic_consume(queue='my_queue', on_message_callback=process_message, auto_ack=True) channel.start_consuming() ``` 6. 启动应用程序: ```python uvicorn main:app --reload ``` 这是一个简单的示例,你可以根据你的需求进行调整和扩展。下面是一些相关问题:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值