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

如何在Django类视图(RedirectView)中后台执行长耗时任务?

在Django RedirectView中后台执行长耗时任务并立即返回响应

你当前代码的问题在于asyncio.run()会阻塞主线程,直到协程sleep_long完全执行完毕,所以才会等所有Run日志打印完成后,才输出后续语句。要实现先返回响应、后台执行任务的效果,可以用以下两种方案:

方案1:使用线程池(WSGI/ASGI环境通用)

将耗时的异步任务放到子线程中执行,主线程无需等待任务完成即可返回重定向响应:

import threading
import asyncio
from django.views.generic.base import RedirectView

class Redirect_to_page(RedirectView):
    async def sleep_long(self):
        for i in range(1,10):
            print(f'Run {i}')
            await asyncio.sleep(1)

    query_string = True
    pattern_name = 'pages:redirect_page'
    
    def get_redirect_url(self, *args, **kwargs):
        # 包装异步任务为线程可执行的函数
        def run_async_task():
            asyncio.run(self.sleep_long())
        
        # 启动子线程执行任务,主线程继续向下执行
        threading.Thread(target=run_async_task, daemon=True).start()
        print('This run before complete!')
        return super().get_redirect_url(*args, **kwargs)

说明:

  • daemon=True标记线程为守护线程,当主线程结束时,守护线程会自动终止(如果不需要任务必须执行完,可以去掉该参数)。
  • 注意线程安全:如果任务涉及数据库操作,Django会自动为每个线程创建独立的数据库连接,无需额外处理,但要避免共享非线程安全的对象。

方案2:使用Django异步视图(仅ASGI环境支持)

如果你的Django项目运行在ASGI服务器(如Daphne、Uvicorn)上,可以将视图改为异步类视图,利用asyncio.create_task()后台调度任务:

import asyncio
from django.views.generic.base import RedirectView

class Redirect_to_page(RedirectView):
    query_string = True
    pattern_name = 'pages:redirect_page'
    
    async def sleep_long(self):
        for i in range(1,10):
            print(f'Run {i}')
            await asyncio.sleep(1)
    
    async def get_redirect_url(self, *args, **kwargs):
        # 创建后台任务,无需等待执行完成
        asyncio.create_task(self.sleep_long())
        print('This run before complete!')
        return super().get_redirect_url(*args, **kwargs)

说明:

  • 必须确保项目配置为ASGI模式,WSGI环境下异步任务可能无法正常后台执行。
  • 该方案更轻量化,但如果服务器进程意外终止,未完成的任务会丢失。

注意事项

  • 如果任务需要持久化、容错或定时执行,建议使用Celery、RQ等专业任务队列框架,避免因服务器重启或进程回收导致任务中断。
  • 后台任务中尽量避免直接操作请求/响应对象,因为视图返回后这些对象可能被销毁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:15:34