Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
FastAPI启动事件中AsyncGenerator依赖注入的正确实践_创想鸟

FastAPI启动事件中AsyncGenerator依赖注入的正确实践

FastAPI启动事件中AsyncGenerator依赖注入的正确实践

本文探讨了在FastAPI应用的startup事件中直接使用Depends()与AsyncGenerator进行资源(如Redis连接)初始化时遇到的问题,并指出Depends()不适用于此场景。核心内容是提供并详细解释了如何通过FastAPI的lifespan上下文管理器来正确、优雅地管理异步生成器依赖,确保应用启动时资源正确初始化,避免AttributeError。

问题背景:在应用启动时初始化异步资源

在构建基于fastapi的异步应用时,我们经常需要在应用启动时初始化一些全局资源,例如数据库连接池、消息队列客户端或缓存连接。fastapi提供了@app.on_event(“startup”)装饰器来处理这些启动任务。同时,为了更好地管理资源生命周期,我们通常会使用异步生成器(asyncgenerator)来创建和关闭这些资源,并结合fastapi的依赖注入系统depends()。然而,当尝试在startup事件中直接将asyncgenerator与depends()结合使用时,可能会遇到意料之外的错误。

考虑一个场景,我们需要在FastAPI应用启动时获取一个Redis异步客户端,并将其用于初始化一个全局的任务队列。我们可能尝试编写如下代码:

import uvicornfrom fastapi import FastAPI, Dependsimport redis.asyncio as redisfrom redis.asyncio import Redisfrom typing import AsyncGeneratorfrom rq import Queue # 假设rq是任务队列库# 配置Redis连接REDIS_HOST = "localhost"REDIS_PORT = 6379redis_pool = redis.ConnectionPool.from_url(f"redis://{REDIS_HOST}:{REDIS_PORT}")async def get_async_redis_client() -> AsyncGenerator[Redis, None]:    """    异步生成器,用于提供Redis客户端连接。    """    async with Redis.from_pool(redis_pool) as client:        yield clientdef process_data(data: str):    """    模拟一个处理数据的函数。    """    print(f"Processing data: {data}")def create_app():    app = FastAPI(docs_url='/')    task_queue: Queue = None # 声明为None,稍后初始化    @app.on_event("startup")    async def startup_event(redis_conn: redis.asyncio.Redis = Depends(get_async_redis_client)):        """        尝试在startup事件中使用Depends()注入Redis连接。        """        nonlocal task_queue        task_queue = Queue("task_queue", connection=redis_conn)        print("Redis connection initialized in startup event.")    @app.post("/add_data")    async def add_data(data: str):        """        添加数据到任务队列。        """        if task_queue:            task_queue.enqueue(process_data, data)            return {"message": "Book in processing"}        return {"message": "Task queue not initialized", "status": "error"}    @app.get("/get_data")    async def get_data():        """        示例接口。        """        return {"data": "kek"}    return appdef main():    uvicorn.run(        f"{__name__}:create_app",        host='0.0.0.0', port=8888,        reload=True    )if __name__ == '__main__':    main()

当运行上述代码并尝试向/add_data端点发送POST请求时,会收到一个AttributeError: ‘Depends’ object has no attribute ‘pipeline’的错误。这表明在startup_event函数中,redis_conn变量并没有被解析成实际的redis.asyncio.Redis对象,而仍然是一个Depends对象。

理解FastAPI的依赖注入与启动事件

FastAPI的Depends()机制主要设计用于请求处理函数中的依赖解析。在请求处理的生命周期中,FastAPI会负责调用依赖函数(包括异步生成器),获取其yield出的值,并在请求结束后执行生成器中yield之后的清理代码。

然而,@app.on_event(“startup”)装饰器下的函数,其执行时机在整个应用开始接受请求之前,并且它不属于标准的请求-响应循环。FastAPI的依赖注入系统并不会像处理路由函数那样,自动解析startup事件函数参数中的Depends()。因此,redis_conn变量接收到的不是get_async_redis_client生成器yield出的Redis客户端实例,而是Depends(get_async_redis_client)这个Depends对象本身。当rq库尝试对这个Depends对象调用pipeline()方法时,自然会抛出AttributeError。

正确实践:利用lifespan管理异步生成器依赖

为了在应用启动时正确地初始化和管理异步生成器提供的资源,FastAPI推荐使用lifespan上下文管理器。lifespan是FastAPI 0.65.0版本引入的一种更现代、更灵活的应用生命周期管理方式,它允许我们定义一个异步上下文管理器,在应用启动前执行设置代码,并在应用关闭前执行清理代码。

通过lifespan,我们可以手动调用异步生成器,获取其yield出的资源,并将其存储在应用实例或全局变量中,供其他部分使用。

以下是使用lifespan解决上述问题的正确方法:

import uvicornfrom fastapi import FastAPIimport redis.asyncio as redisfrom redis.asyncio import Redisfrom typing import AsyncGeneratorfrom rq import Queue # 假设rq是任务队列库from contextlib import asynccontextmanager# 配置Redis连接REDIS_HOST = "localhost"REDIS_PORT = 6379redis_pool = redis.ConnectionPool.from_url(f"redis://{REDIS_HOST}:{REDIS_PORT}")async def get_async_redis_client() -> AsyncGenerator[Redis, None]:    """    异步生成器,用于提供Redis客户端连接。    """    print("Opening Redis connection...")    async with Redis.from_pool(redis_pool) as client:        yield client    print("Closing Redis connection...") # 应用关闭时执行def process_data(data: str):    """    模拟一个处理数据的函数。    """    print(f"Processing data: {data}")# 定义一个全局变量来存储任务队列task_queue: Queue = None@asynccontextmanagerasync def lifespan(app: FastAPI):    """    FastAPI应用生命周期管理器。    在应用启动时初始化资源,在应用关闭时清理资源。    """    global task_queue # 声明使用全局变量    # 手动调用异步生成器以获取Redis连接    # 注意:这里直接调用get_async_redis_client(),并迭代它    # app.dependency_overrides.get(get_async_redis_client, get_async_redis_client)    # 这一步是为了兼容可能存在的依赖覆盖,确保获取到的是最终的依赖函数    redis_generator_func = app.dependency_overrides.get(get_async_redis_client, get_async_redis_client)    async for redis_conn in redis_generator_func():        # 在这里,redis_conn已经是实际的Redis客户端对象        task_queue = Queue("task_queue", connection=redis_conn)        print("Redis connection and Task Queue initialized via lifespan.")        yield # 应用在此处启动并处理请求    # 应用关闭时,生成器会继续执行,清理Redis连接    print("Application shutdown: Resources released.")def create_app():    app = FastAPI(        docs_url='/',        lifespan=lifespan # 将lifespan上下文管理器传递给FastAPI    )    @app.post("/add_data")    async def add_data(data: str):        """        添加数据到任务队列。        """        if task_queue:            task_queue.enqueue(process_data, data)            return {"message": "Book in processing"}        return {"message": "Task queue not initialized", "status": "error"}    @app.get("/get_data")    async def get_data():        """        示例接口。        """        return {"data": "kek"}    return appdef main():    uvicorn.run(        f"{__name__}:create_app",        host='0.0.0.0', port=8888,        reload=True    )if __name__ == '__main__':    main()

在这个修正后的代码中:

@asynccontextmanager装饰器: 我们使用contextlib.asynccontextmanager装饰器将lifespan函数转换为一个异步上下文管理器。lifespan函数: 这个函数现在负责整个应用的生命周期。在yield之前,它执行应用启动时的初始化逻辑。我们在这里手动调用get_async_redis_client()异步生成器,并通过async for循环获取yield出的redis_conn对象。app.dependency_overrides.get(get_async_redis_client, get_async_redis_client)这一步是为了确保即使get_async_redis_client被覆盖(例如在测试环境中),lifespan也能获取到正确的依赖函数。task_queue被正确地用解析后的redis_conn对象初始化。yield语句将控制权交还给FastAPI,此时应用开始处理请求。当应用关闭时(例如通过发送中断信号),yield之后的代码会被执行,从而触发get_async_redis_client生成器中的清理逻辑(async with Redis.from_pool(redis_pool) as client:块的退出)。FastAPI(lifespan=lifespan): 在创建FastAPI应用实例时,通过lifespan参数注册我们定义的生命周期管理器。

注意事项

全局变量管理: 在lifespan函数中修改全局变量(如task_queue)时,务必使用global关键字来指示您正在修改全局作用域的变量,而不是创建局部变量。依赖覆盖兼容性: app.dependency_overrides.get(get_async_redis_client, get_async_redis_client)是一个健壮的做法。它首先检查get_async_redis_client是否被app.dependency_overrides覆盖。如果没有,它就使用原始的get_async_redis_client函数。这对于测试和更复杂的应用场景非常有用。资源清理: 使用AsyncGenerator结合async with语句是管理异步资源生命周期的推荐方式。lifespan上下文管理器确保了AsyncGenerator的清理部分在应用关闭时被正确执行。startup事件与lifespan: 尽管@app.on_event(“startup”)仍然可用,但对于需要复杂初始化和清理逻辑的资源,或者需要与依赖注入系统交互的场景,lifespan提供了更强大、更清晰的机制。

总结

在FastAPI中,Depends()装饰器是为请求处理函数设计的依赖注入机制,不适用于@app.on_event(“startup”)事件。当需要在应用启动时利用AsyncGenerator初始化全局资源时,正确的做法是使用FastAPI的lifespan上下文管理器。通过手动调用异步生成器并将其结果存储在全局变量中,我们可以确保资源在应用启动时被正确初始化,并在应用关闭时被优雅地清理,从而避免因依赖解析不当导致的AttributeError。这种方法不仅解决了特定问题,也体现了FastAPI在应用生命周期管理上的灵活性和强大功能。

以上就是FastAPI启动事件中AsyncGenerator依赖注入的正确实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1374492.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
深入理解Python Enum 类的动态创建与命名机制
上一篇 2025年12月14日 14:11:58
Python中解析ISO8601日期时间字符串的正确姿势
下一篇 2025年12月14日 14:12:13

相关推荐

  • NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场

    NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场

    英伟达总市值逼近4.5万亿美元#英伟达 这两年来ai领域最大的赢家并非微软、谷歌或openai,而是nvidia。凭借在ai gpu领域的绝对主导地位,nvidia不仅实现了业绩的爆发式增长,更在近期将公司市值推向了约4.5万亿美元的历史新高。 在AI显卡市场,NVIDIA几乎处于垄断地位。尽管不同…

    2026年9月26日 • 用户投稿
    1100
  • CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别

    CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别

    CountDownLatch用于主线程等待其他线程完成操作,CyclicBarrier用于多线程相互等待至屏障点后集体执行,Semaphore用于控制并发访问资源的线程数量。 CountDownLatch, CyclicBarrier, Semaphore 都是并发编程中用于线程同步的工具,但它们的…

    2026年9月26日 • 用户投稿
    500
  • DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试

    DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试

    ddr5内存可以超频到6400mhz,但需要仔细调整和测试以确保稳定性。1.选择适合超频的ddr5内存条时,优先考虑芝奇幻锋戟系列,选择标有“oc”标签且规格接近目标频率的产品。2.在bios中将频率设为6400mhz,从宽松时序如cl36-36-36-76开始调整,并设定电压在1.25v到1.35…

    2026年9月26日 • 用户投稿
    000
  • 基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案

    基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案

    Quarkus通过GraalVM Native Image预编译实现启动时间低于0.5秒,需配置pom.xml插件、优化依赖、使用Quarkus CLI并监控调优。 Quarkus通过预编译和GraalVM Native Image等技术,让Java应用在云原生环境中拥有极低的启动时间和内存占用。本…

    2026年9月26日 • 用户投稿
    500
  • JavaAI实战:基于DeepLearning4j实现目标检测模型部署

    JavaAI实战:基于DeepLearning4j实现目标检测模型部署JavaAI实战:基于DeepLearning4j实现目标检测模型部署JavaAI实战:基于DeepLearning4j实现目标检测模型部署JavaAI实战:基于DeepLearning4j实现目标检测模型部署

    答案:在Java中通过DeepLearning4j部署目标检测模型需完成模型转换、数据预处理、推理执行和结果解析。首先利用KerasModelImport或ONNX将TensorFlow/Keras模型转为DL4J兼容格式,注意版本匹配与层兼容性;接着通过NativeImageLoader加载图像并…

    2026年9月26日 • 用户投稿
    600
  • 多模态输入的限制有哪些 输入内容类型与格式注意事项

    多模态输入的限制有哪些 输入内容类型与格式注意事项多模态输入的限制有哪些 输入内容类型与格式注意事项多模态输入的限制有哪些 输入内容类型与格式注意事项多模态输入的限制有哪些 输入内容类型与格式注意事项

    多模态输入是人工智能领域令人兴奋的发展方向,它赋予机器同时处理和理解多种信息类型的能力,例如将视觉、听觉与文本信息相结合。这项技术极大地扩展了人机交互的可能性。然而,如同任何新兴技术,多模态输入并非没有其固有挑战和局限性。了解这些限制以及如何恰当地准备输入内容,对于有效利用多模态系统的潜力至关重要。…

    2026年9月26日 • 用户投稿
    000
  • K8s为啥要启用bridge-nf-call-iptables内核参数?用案例给你讲明白!

    使用 kubernetes 遇到最多的 70%问题都可以归于网络问题,最近发现如果内核参数: bridge-nf-call-iptables设置不当的话会影响 kubernetes 中 node 节点上的 pod 通过 clusterip 去访问同 node上的其它 pod 时会有超时现象,复盘记录…

    2026年9月26日
    100
  • 多模态AI能否理解视频内容 视频处理能力分析与使用建议

    多模态AI能否理解视频内容 视频处理能力分析与使用建议多模态AI能否理解视频内容 视频处理能力分析与使用建议多模态AI能否理解视频内容 视频处理能力分析与使用建议多模态AI能否理解视频内容 视频处理能力分析与使用建议

    多模态AI处理视频是一个涉及多个数据流融合的技术领域。本文旨在探讨多模态AI如何理解视频内容,分析其当前的处理能力,并提供一些使用上的建议,帮助读者更好地认识和应用这项技术。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 多模态AI理解视频…

    2026年9月26日 • 用户投稿
    400
  • vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法

    vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法

    可通过修改用户代理(UA)标识使vivo浏览器访问电脑版网页。首先尝试在设置中将UA标识切换为“Desktop”模式;若不支持,可手动输入电脑版UA字符串;还可安装UA切换插件实现一键切换,刷新页面后即可加载桌面版网站内容。 如果您在使用vivo浏览器时希望访问电脑版网页,但页面自动跳转至移动版,可…

    2026年9月26日 • 用户投稿
    400
  • 小红书动态无法点赞怎么办

    小红书动态无法点赞怎么办小红书动态无法点赞怎么办小红书动态无法点赞怎么办小红书动态无法点赞怎么办

    先检查账号状态、网络环境及客户端问题。确认账号无违规、笔记可推广,避免异常操作;刷新登录、切换网络、清缓存、更新App;换设备测试排除风控,禁用多开软件;若均无效,联系客服解决。 小红书动态无法点赞,通常由账号状态、网络环境或客户端问题引起。可以按以下步骤逐一排查解决。 检查账号与内容状态 账号或发…

    2026年9月26日 • 用户投稿
    500
  • 苹果最新的耳机是什么型号

    苹果最新的耳机是什么型号苹果最新的耳机是什么型号苹果最新的耳机是什么型号苹果最新的耳机是什么型号

    苹果于 2022 年 9 月发布了 AirPods Pro 2,其主要功能包括:改进的主动降噪 (ANC)自适应透明模式个性化空间音频触控控制H2 芯片提供更好的声音质量和更长的电池续航时间耐汗和防水 (IPX4)ANC 开启时可播放长达 6 小时,配合充电盒可播放长达 30 小时 苹果最新耳机型号…

    2026年9月26日 • 用户投稿
    100
  • DeepSeek能做代码生成吗 使用DeepSeek进行编程任务的能力测试

    DeepSeek能做代码生成吗 使用DeepSeek进行编程任务的能力测试DeepSeek能做代码生成吗 使用DeepSeek进行编程任务的能力测试DeepSeek能做代码生成吗 使用DeepSeek进行编程任务的能力测试DeepSeek能做代码生成吗 使用DeepSeek进行编程任务的能力测试

    本文将探讨名为DeepSeek的语言模型在代码生成领域的表现。针对“DeepSeek能做代码生成吗?”这一问题,我们将阐述其在编程任务上的能力,并模拟进行一次能力测试的描述,帮助读者了解DeepSeek作为编程助手的潜力及其适用场景。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量…

    2026年9月26日 • 用户投稿
    200
  • 可能是目前效果最好的开源生图模型,混元生图 3.0 来了

    可能是目前效果最好的开源生图模型,混元生图 3.0 来了可能是目前效果最好的开源生图模型,混元生图 3.0 来了可能是目前效果最好的开源生图模型,混元生图 3.0 来了可能是目前效果最好的开源生图模型,混元生图 3.0 来了

    腾讯混元最新发布并开源原生多模态生图模型——混元图像 3.0(hunyuanimage 3.0)! 模型参数规模高达 80B,是目前参数量最大的开源生图模型。 同时,HunyuanImage 3.0 将理解与生成一体化融合,也是首个开源工业级原生多模态生图模型,效果对标业界头部闭源模型,堪称目前开源…

    2026年9月26日 • 用户投稿
    400
  • 抖音内容怎么吸引流量_抖音内容吸引流量的核心方法

    抖音内容怎么吸引流量_抖音内容吸引流量的核心方法抖音内容怎么吸引流量_抖音内容吸引流量的核心方法抖音内容怎么吸引流量_抖音内容吸引流量的核心方法抖音内容怎么吸引流量_抖音内容吸引流量的核心方法

    答案:提升抖音推荐需优化开头3秒、内容结构、互动率、AI工具和垂直领域。打造强钩子如结果前置、冲突制造、高悬念提问;采用痛点—解决—升华结构,每30秒设信息点;引导评论、挑战和点赞;用AI生成素材与分析数据;明确账号定位并连续发布同领域内容10条以上,前3-5天模拟用户行为助系统打标。 如果您发布的…

    2026年9月26日 • 用户投稿
    400
  • AI辩论教练:用豆包AI+Character模拟对手训练逻辑反应

    AI辩论教练:用豆包AI+Character模拟对手训练逻辑反应AI辩论教练:用豆包AI+Character模拟对手训练逻辑反应AI辩论教练:用豆包AI+Character模拟对手训练逻辑反应AI辩论教练:用豆包AI+Character模拟对手训练逻辑反应

    你可以使用豆包ai和character.ai进行辩论训练,具体步骤包括:1.选择合适的平台,豆包ai适合快速访问,character.ai适合丰富角色设定;2.创建或选择辩论角色并设定背景、立场和风格;3.明确辩题并输入给ai;4.轮流发言并及时记录分析;5.利用豆包ai进行观点碰撞、论据挖掘和模拟…

    2026年9月26日 • 用户投稿
    100
  • Java项目质量保障体系:静态分析、单元测试与集成测试

    Java项目质量保障体系:静态分析、单元测试与集成测试Java项目质量保障体系:静态分析、单元测试与集成测试Java项目质量保障体系:静态分析、单元测试与集成测试Java项目质量保障体系:静态分析、单元测试与集成测试

    静态分析是Java质量保障的第一道防线,因其能在代码运行前发现潜在缺陷。SonarQube等工具通过集成Checkstyle、PMD等规则集,实现代码规范、安全、性能的全面扫描,及早暴露空指针、资源泄漏等问题,减少技术债。它作为“预检系统”,避免低级错误流入后续阶段,提升整体代码整洁度,为单元与集成…

    2026年9月26日 • 用户投稿
    100
  • 如何解决MySQL版本兼容性问题的处理方法?

    如何解决MySQL版本兼容性问题的处理方法?如何解决MySQL版本兼容性问题的处理方法?如何解决MySQL版本兼容性问题的处理方法?如何解决MySQL版本兼容性问题的处理方法?

    mysql版本兼容性问题可通过升级、降级或编写兼容代码解决。具体步骤为:1.明确问题根源,如sql语法、函数或协议不兼容;2.选择升级或降级版本,优先考虑升级以获取优化和修复;3.使用注释语法编写兼容性sql;4.借助orm框架屏蔽底层差异;5.通过查询版本号或配置文件实现条件判断;6.利用dock…

    2026年9月26日 • 用户投稿
    100
  • 自媒体内容怎么避免同质化_避免自媒体内容同质化的实用方法

    自媒体内容怎么避免同质化_避免自媒体内容同质化的实用方法自媒体内容怎么避免同质化_避免自媒体内容同质化的实用方法自媒体内容怎么避免同质化_避免自媒体内容同质化的实用方法自媒体内容怎么避免同质化_避免自媒体内容同质化的实用方法

    内容同质化指不同来源的信息高度相似,缺乏独特性。其表现为内容重复、视角单一、模板化创作等;核心原因包括平台算法驱动形成“信息茧房”、原创成本高导致复制泛滥、创作者创新能力不足;这会降低用户信息筛选效率,阻碍多元思考,并削弱社会创新动力;解决方向需优化算法以增加多样性权重、加强原创保护机制,并提升用户…

    2026年9月26日 • 用户投稿
    000
  • 豌豆素质如何退费

    豌豆素质如何退费豌豆素质如何退费豌豆素质如何退费豌豆素质如何退费

    在选择教育课程时,退费问题一直是大家关注的焦点。对于豌豆素质的退费流程,很多家长都希望能有一个全面清晰的了解。 首先,要明确退费的条件。一般来说,如果在课程未开始前申请退费,通常是比较容易办理的。比如因为个人时间安排冲突,提前向豌豆素质官方客服说明情况,经过核实后,会按照一定比例退还已缴纳的费用。 …

    2026年9月26日 • 用户投稿
    000
  • 研祥智能亮相2025工博会:工业智能,此刻正在爆发!

    研祥智能亮相2025工博会:工业智能,此刻正在爆发!研祥智能亮相2025工博会:工业智能,此刻正在爆发!研祥智能亮相2025工博会:工业智能,此刻正在爆发!研祥智能亮相2025工博会:工业智能,此刻正在爆发!

    9月23日,2025工博会正式拉开帷幕 创新浪潮席卷申城 人流与焦点在此交汇 在6.1HD005展位上 研祥智能开启了一场关于工业智能化的深度对话 全场景解决方案与自主可控成果重磅登场 本次展会,研祥智能携“5+N”全场景工业制造解决方案及20余款新品惊艳亮相,精准聚焦锂电制造、低空经济、智慧工厂、…

    2026年9月26日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信