You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 4.2.4异步模式下AppConfig.ready正确实现方式咨询

解决Django 4.2.4异步模式下AppConfig.ready方法的警告问题

核心原因

Django的AppConfig.ready()方法必须是同步函数,无论项目是否运行在异步模式下,Django启动流程只会同步调用该方法,不会处理异步协程。如果将ready定义为async def,Django调用后不会await它,必然触发"coroutine was never awaited"警告;如果同步ready方法调用了未被await的协程函数,也会触发类似警告。

正确实现方式

1. 执行普通同步代码

直接在同步ready方法中调用同步函数即可,无需额外包装:

class CoreConfig(AppConfig):
    name = 'demo.core'

    def ready(self):
        from .utils import my_sync_func
        my_sync_func()

2. 执行异步代码

如果需要在ready中运行异步函数,保持ready为同步方法,用asyncio.run()手动执行协程:

class CoreConfig(AppConfig):
    name = 'demo.core'

    def ready(self):
        import asyncio
        from .utils import my_async_func  # 该函数为async def定义

        asyncio.run(my_async_func())

3. 同步函数需在异步上下文执行(如ORM操作)

如果你的同步函数需要在异步环境中运行(比如调用Django ORM),可以用sync_to_async包装后,再通过asyncio.run()执行:

class CoreConfig(AppConfig):
    name = 'demo.core'

    def ready(self):
        import asyncio
        from asgiref.sync import sync_to_async
        from .utils import my_sync_func

        asyncio.run(sync_to_async(my_sync_func)())

为什么之前的改写无效?

你将ready改为async def后,Django启动时只会同步调用该方法,不会await这个协程对象,导致协程从未被执行,因此警告仍然存在。必须保持ready为同步方法,手动处理异步逻辑。

内容的提问来源于stack exchange,提问作者schacki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:08:15