Python 如何设计可能需要太长时间的API后端请求

Python 如何设计可能需要太长时间的API后端请求,python,rest,flask,backend,Python,Rest,Flask,Backend,假设我有一个API端点,它生成一个PDF文件,其中包含客户端发送的大量图像 服务器可以在下载图像之前通过获取图像大小来估计需要多长时间,但不能将忙/慢网络峰值考虑在内 所以,很明显,服务器只是返回一个正在进行的信号,并在文件完成时发送一封电子邮件或其他东西,对吗 但是,如果用户发送了一个非常小的图像样本,并且不需要发送电子邮件,该怎么办?是否有可能确定这一因素?服务器是否可以计算出该文件最终非常小,以至于它完全可以直接发送而不必从浏览器中超时 我对全栈开发还不熟悉,但我相信这一定是一个常见的问题

假设我有一个API端点,它生成一个PDF文件,其中包含客户端发送的大量图像

服务器可以在下载图像之前通过获取图像大小来估计需要多长时间,但不能将忙/慢网络峰值考虑在内

所以,很明显,服务器只是返回一个正在进行的信号,并在文件完成时发送一封电子邮件或其他东西,对吗

但是,如果用户发送了一个非常小的图像样本,并且不需要发送电子邮件,该怎么办?是否有可能确定这一因素?服务器是否可以计算出该文件最终非常小,以至于它完全可以直接发送而不必从浏览器中超时

我对全栈开发还不熟悉,但我相信这一定是一个常见的问题,有没有名字?考虑到以下情况,此问题的常见解决方法和解决方案是什么:

1向用户发送电子邮件不是理想的解决方案

2在文件创建过程中无法流式传输文件


3如果用户放弃/关闭浏览器/失去连接等,应停止处理。

检测连接不再处于活动状态应该相当容易。那么,为什么不在渲染完文件后检查连接是否处于活动状态,以及它是否仍然处于活动状态,然后立即将其发送回去呢。如果不是,那么你可以通过电子邮件发送文件。此外,如果您正在发回文件,而浏览器超时,则只需通过电子邮件发送文件即可


至于估计所有这些东西,对于如何估计这些东西没有完美的解决方案。你不可能知道是否有人在地铁里用手机使用你的网站,突然进入隧道,失去了所有服务

可以简化客户端处理不同响应代码和格式的需要的一个选项是让API返回一个HTTP 202,并返回一个表示新PDF资源id的id。在这种情况下,API可以立即响应并执行创建PDF所需的任何异步处理。然后,客户机可以通过单独的端点(如GET/pdf/)从API查询资源。如果PDF仍在处理中,API将返回404,直到完成为止


如果您不希望客户端持续轮询API,您可以定义默认发送电子邮件之前愿意等待的某个时间阈值。例如,调用API后立即启动计时器并开始生成PDF,如果计时器超过您愿意接受的阈值,则返回HTTP 202并在处理完成后发送电子邮件(可选)。如果PDF生成在时间阈值之前完成,则在响应中返回一个包含PDF文件的HTTP 2xx。

我不知道服务器可以检测到非web套接字上的关闭连接request@Mojimi如果试图写入已关闭的套接字,肯定会出错。我想我应该澄清一下,服务器所做的所有通信都是通过一个套接字进行的,而不是一个web套接字,而是一个普通的服务器套接字。如果你查看如何实现一个基本的web服务器,你会发现大多数服务库都只是构建在套接字之上的抽象。对于像我正在使用的flask这样的服务器,我真的不确定这是否可行,因为响应总是包装器路由器函数的返回值,但我会调查一下。看看GitHub的问题,你知道有任何javascript库可以做到这一点吗?我建议看看JS中的承诺,它们提供了一种实现连续轮询异步回调的非常简单的方法: