我有一个服务器,它需要几分钟来处理一个特定的请求,然后响应它。
客户端必须一直等待响应而不知道它何时会完成。
有没有办法让客户知道处理状态? (比如说完成了 50%,完成了 80%),而无需客户端轮询状态。
最佳答案
在没有使用任何较新的技术(websockets、webpush/http2...)的情况下,我之前使用了简化的 Pushlet 或 Long 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/