返回201视图后如何运行函数

时间:2015-02-19 00:21:37

标签: python rest multithreading django

我正在使用Django Python框架和Django REST框架。保存模型的新实例时,我需要生成本地保存在服务器上的PDF。有没有一种方法可以分支生成PDF的任务,以便用户在服务器生成PDF时立即获得201返回?我不知道这是否适用于多线程。

在启动PDF生成之前调用父级的保存功能,因此在它之间可以安全地返回201.

def save(self, *args, **kwargs):
        set_pdf = False
        if self.id is None and self.nda_pdf is not None and len(self.nda_pdf) > 0:
            set_pdf = True
        super(Visitor, self).save(*args, **kwargs)
        if set_pdf: generate_pdf(self)

我希望在向客户返回内容之后调用generate_pdf(self)函数

1 个答案:

答案 0 :(得分:1)

根据生成PDF需要多少工作量,您可能希望阻止响应,直到生成文件,然后才返回HTTP 201.

对于客户端和服务器,它对多线程都没有影响:

  • 客户端应该以任何方式执行非阻塞请求(或者至少从与处理UI事件的线程不同的线程执行这些请求)。此外,如果客户不关心响应(即PDF是否正确生成),则由客户端发送请求而不等待响应。

    < / LI>
  • 服务器......好吧,服务器无论如何都必须进行PDF生成。返回HTTP 201立即无法改变任何内容。此外,服务器当前正在响应一个请求这一事实并不意味着它不会处理另一个请求(除非您有太多请求或使用非常奇怪的HTTP服务器)。

    < / LI>

如果PDF生成实际上需要很长时间(例如超过一分钟),那么返回 HTTP 202 Accepted and not HTTP 201!)可以是一种解决方案,以避免超时或情况客户不会理解为什么服务器没有响应太长时间。