Django 如何处理另一个请求中的长请求?

How Django handling long request in another request?

关于 django 在另一个请求(3 秒)中处理一个长请求(50 秒)的问题。

我有一个 POST 请求将为用户 return 一些信息,在这个请求中将在同一个应用程序中调用另一个 api 然后它将查询数据库并生成 pdf 报告上传到s3,大约需要50秒。

我怎样才能让用户首先请求 return 信息并在后台生成 pdf api 运行?

我做了一些研究,发现 Celery 可能可以处理这个任务,这个推荐吗?或者有人有建议吗?

提前致谢!!!

是的,这是您引入 celery, rq, or huey 等解决方案的地方。

在后端,您将使用像 redis 这样的服务器,它存储您安排的作业的状态(以及它们是否出错)。

以上3种,我强烈推荐芹菜。它存在的时间更长,并且对 sentry 和 Scout APM 等服务具有更好的遥测能力。

首先,这是 First steps with Django on celery documentation website and its sample django project on GitHub 的 link。

进入工作心态

  • 数据已序列化

    这意味着要传输数据,内容将是 pickled or encoded in json

  • 将对象 ID/原始数据传递给预定函数

    • 好:book_id作为str,然后在预定函数中查找Book.objects.get(pk=book_id)。即使这意味着进行冗余查询 - 它至少是您可以依赖的新数据。

    • 危险:在作业参数中传递模型实例(例如 Book 模型的 book)。该任务可能由于不可序列化而简单地出错。即使 if 序列化,您的数据在函数运行时也可能已过时或陈旧。

  • 保存任务 ID,以便您可以查看作业的状态:这样可以确定作业是否已经在进行中。