python - Flask/http- 告诉客户端请求需要更多时间才能完成

标签 python rest http flask

我有一个 Web 服务 (REST),其中一个请求可能需要长达 30 秒才能返回答案(大量计算)。存在一个风险,即在计算期间,客户端网络浏览器中止(?)现有连接并重试。这是服务器端的控制台输出:

Exception happened during processing of request from ('127.0.0.1', 53209)
Traceback (most recent call last):
  File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 290, in _handle_request_noblock
    self.process_request(request, client_address)
  File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 318, in process_request
    self.finish_request(request, client_address)
  File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 331, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 654, in __init__
    self.finish()
  File "C:\Users\tmx\Anaconda2\lib\SocketServer.py", line 713, in finish
    self.wfile.close()
  File "C:\Users\tmx\Anaconda2\lib\socket.py", line 283, in close
    self.flush()
  File "C:\Users\tmx\Anaconda2\lib\socket.py", line 307, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine

我想到的一个选项是以某种方式通知客户端“我还活着,但请求仍然需要更多时间”,或者以某种方式在服务器端设置超时。有哪些可能性?

最佳答案

在您已经返回一些数据后,很难在 Flask 中运行代码。您的选择是要么使用任务队列之类的东西(请参阅 Celery ),要么在多个部分产生您的响应。

Flask 中的 View 可以返回字符串,但它们也可以返回包含字符串的可迭代对象。因此,您可以返回 "abc"["abc"] 或生成 "abc" 的生成器。如果您在两次产出之间进行处理,数据将在请求仍在运行时发送到客户端。

看看下面的例子:

def generator_that_does_the_calculation():
    sleep(1)
    yield "I'm alive, but I need some time\n"
    sleep(1)
    yield "Still alive here\n"
    sleep(1)
    yield "Done\n"

@app.route('/calculate')
def calculate():
    return Response(generator_that_does_the_calculation())

关于python - Flask/http- 告诉客户端请求需要更多时间才能完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42491802/

相关文章:

java - Java中通过终端向服务器发送HTTP PUT请求

python - 如何修复属性错误: 'NoneType' object has no attribute 'click'

python - Django 测试并行 AppRegistryNotReady

mysql - Flask 中剩余查询参数的模式

java - 地理服务器管理器,添加一个新层

javascript - JQuery 没有发布到 Express 后端

java - OkHttpClient 将 http URL 重定向到 Https 并给出带有 https URL 的 SSLException

python - 类型错误 : not enough arguments for format string while importing CSV to MySQL using Python

python - Pandas 日期时间 : Calculate Number of Weeks Between Dates in Two Columns

Azure Devops API 用于获取包含文件夹的存储库中的所有文件