Получение ответа Python HttpServer мгновенно - PullRequest
0 голосов
/ 12 октября 2018

Я использую Python HttpServer на стороне сервера.Один GET запрос займет больше времени для ответа, и я хочу обновить его текущее состояние, например 'Fetching module X. Please wait', 'Fetching module Y. Please wait'.

Но он не обновляется на стороне клиента, хотя я посылаю его между модулями.Я попытался очистить поток, но безуспешно.

self.wfile.write('Fetching module X. Please wait')
self.wfile.flush() 

Как я могу заставить HttpServer отправить информацию мгновенно, вместо того, чтобы ждать завершения полного ответа?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Предлагаем поставить user indication на header, а не body.Затем вы можете использовать stream для удовлетворения ваших требований.

ПРИМЕЧАНИЕ: Следующий код основан на python2, вы можете изменить http server related на python3 related api, если хотите.

server.py:

import BaseHTTPServer
import time

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    Page = "Main content here."
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type", "text/html")
        self.send_header("Content-Length", str(len(self.Page)))
        self.send_header("User-Information", "Fetching module X. Please wait")
        self.end_headers()
        time.sleep(10)
        self.wfile.write(self.Page)

if __name__ == '__main__':
    serverAddress = ('', 8080)
    server = BaseHTTPServer.HTTPServer(serverAddress, RequestHandler)
    server.serve_forever()

client.py:

import requests

r = requests.get('http://127.0.0.1:8080', stream=True)
print(r.headers['User-Information'])
print(r.content)

Объяснить:

  1. Если используется stream, клиент все равно будет получать header information, поэтому вы можете сразу распечатать его пользователю с помощью print(r.headers['User-Information'])

  2. Но с stream, body information не будет передавать, оно будет отложено до тех пор, пока клиент не использует r.content, чтобы потребовать его (Response.iter_lines() or Response.iter_content() также нормально), поэтому, когда вы делаете print(r.content), ему потребуется 10 seconds длясм. основное содержимое, как оно стоит 10s в коде сервера.

Вывод: (Первая строка будет показана пользователю сразу, а вторая строка будет показана через 10 секунд)

Извлечение модуля X. Пожалуйста, подождите

Основное содержание здесь.

Приложите руководство для справки, надеюсь, этополезно.

0 голосов
/ 12 октября 2018

Вы можете использовать Python Threading

from threading import Thread
t = threading.Thread(target=function to be call, args=[request])
t.setDaemon(False)
t.start()

Этот код заставит мгновенно вернуть ответ и запустить вашу функцию в фоновом режиме.

...