【问题标题】:Faking a Streaming Response in Django to Avoid Heroku Timeout在 Django 中伪造流响应以避免 Heroku 超时
【发布时间】:2017-12-18 09:09:52
【问题描述】:

我有一个 Django 应用程序,它使用 django-wkhtmltopdf 在 Heroku 上生成 PDF。一些响应超过了 30 秒超时。因为这是在免费层上运行的概念验证,所以我不想拆开我必须转移到工作人员/民意调查进程的内容。我当前的视图如下所示:

def dispatch(self, request, *args, **kwargs):
    do_custom_stuff()
    return super(MyViewClass, self).dispatch(request, *args, **kwargs)

有没有办法我可以覆盖视图类的 dispatch 方法来伪造流响应 like this 或使用 Empy Chunking approach mentioned here 发送空响应,直到 PDF 被呈现?发送empty byte will restart the timeout process 以留出足够的时间发送 PDF。

【问题讨论】:

  • 伪造响应如何解决超时问题?
  • @DanielRoseman 好问题,更新解释。
  • 您可以使用渠道来解决问题吗?

标签: django pdf heroku


【解决方案1】:

我使用 Celery 解决了类似的问题,类似这样。

def start_long_process_view(request, pk):
    task = do_long_processing_stuff.delay()
    return HttpResponse(f'{"task":"{task.id}"}')

然后你可以有第二个视图来检查任务状态。

from celery.result import AsyncResult

def check_long_process(request, task_id):
    result = AsyncResult(task_id)
    return HttpResponse(f'{"state":"{result.state}"')

最后使用 javascript,您可以在任务开始后获取状态。每半秒更新一次足以为您的用户提供良好的反馈。

如果您认为 Celery 太多了,有一些轻巧的替代品会很好用:https://djangopackages.org/grids/g/workers-queues-tasks/

【讨论】:

  • :) 如果可以的话,这实际上是我试图避免的方法,因为我们即将超出预算。如果需要,我会和工人/投票一起去。谢谢。
  • 登录到浏览器控制台是否被视为响应?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2011-11-19
  • 2014-04-02
相关资源
最近更新 更多