python - 在发送实际响应之前发送请求的间歇状态

标签 python http client-server uwsgi wsgi

我有一个服务器,它需要几分钟来处理一个特定的请求,然后响应它。

客户端必须一直等待响应而不知道它何时会完成。

有没有办法让客户知道处理状态? (比如说完成了 50%,完成了 80%),而无需客户端轮询状态。

最佳答案

在没有使用任何较新的技术(websockets、webpush/http2...)的情况下,我之前使用了简化的 PushletLong polling 解决方案用于 HTTP 1.1和各种javascript或者自己的客户端实现。如果我的解决方案不适合您的用例,您可以随时搜索这两个名称以了解更多可能的方法。

客户 发送请求,读取 17 个字节(初始 http 响应),然后一次读取 2 个字节获取处理状态。

服务器 发送一个有效的 HTTP 响应,并在请求过程中发送 2 个字节的完成百分比,直到最后 2 个字节“正常”并关闭连接。

更新:示例 uwsgi server.py

 from time import sleep
 def application(env, start_response):
     start_response('200 OK', [])

     def working():
         yield b'00'
         sleep(1)
         yield b'36'
         sleep(1)
         yield b'ok'
     return working()

更新:示例请求 client.py

import requests

response = requests.get('http://localhost:8080/', stream=True)
for r in response.iter_content(chunk_size=2):
    print(r)

示例服务器(仅用于测试:)

import socket
from time import sleep
HOST, PORT = '', 8888

listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)

while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
    client_connection.send('HTTP/1.1 200 OK\n\n')
    client_connection.send('00')  # 0%
    sleep(2)  # Your work is done here
    client_connection.send('36')  # 36%
    sleep(2)  # Your work is done here
    client_connection.sendall('ok')  # done
    client_connection.close()

如果最后 2 个字节不是“ok”,则以其他方式处理错误。这不是漂亮的 HTTP 状态代码合规性,而是多年前对我有用的解决方法。

telnet 客户端示例

$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 200 OK

0036okConnection closed by foreign host.

关于python - 在发送实际响应之前发送请求的间歇状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45319645/

相关文章:

java - MultitClient 服务器 - 允许持续通信

c# - 远程监控设计

python - Django "homepage"应用程序 urls.py 问题

python - python 中的数组切片

Python:从字符串中删除一个字符

python - 如何选择 numpy 数组中的特定列?

http - 如何在雅司(erlang)中检测移动浏览器

python - 在 Python (Flask) 中将 GET 更改为 POST

node.js - Express Http 请求超时

python - 使用单个终端接口(interface)处理多个客户端请求