Как обслуживать каталог с этим кодом?
стандартный пакет Python 2.7, обеспечивающий HTTP-сервер, который выполняет одновременнопотоковый соединения на тот же номер порта.
Привет вам, модераторы, пожалуйста, перестаньте помечать мой вопрос как дубликат вопросов, которые хотят обслуживать не в потоковом режиме, как этот: Многопоточный веб-сервер в Python, Нет, я не хочу такой взлом, какThreadingMixIn
это просто собирает ответ и возвращает его как единое целое.
Другими словами, я ищу стандартный способ сделать то, что делает следующая программа-пример, но без написания всего HTTP-сервера сам.
import time, socket, threading
sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 8000
sock.bind((host, port))
sock.listen(1)
# my OWN HTTP server... Oh man, this is bad style.
HTTP = "HTTP/1.1 200 OK\nContent-Type: text/html; charset=UTF-8\n\n"
class Listener(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.daemon = True # stop Python from biting ctrl-C
self.start()
def run(self):
conn, addr = sock.accept()
conn.send(HTTP)
# serve up an infinite stream
i = 0
while True:
conn.send("%i " % i)
time.sleep(0.1)
i += 1
[Listener() for i in range(100)]
time.sleep(9e9)
Итак, сначала я попробовал:
# run with this command:
# gunicorn -k gevent myapp:app
import time
def app(environ, start_response):
data = b"Hello, World!\n"
start_response("200 OK", [
("Content-Type", "text/plain"),
("Content-Length", str(len(data)))
])
for i in range(5):
time.sleep(1)
yield "Hello %i\n" % i
# https://stackoverflow.com/questions/22739394/streaming-with-gunicorn
но, к сожалению, это не поток, даже с-k gevent
.
Обновление: кажется, что gunicorn пытается сделать keepalive, что потребовало бы Chunked Transfer Coding сlast-chunk
немного. Быстрый обзор источников показывает, что он не реализует это. Поэтому мне может понадобиться более изящный HTTP-сервер или более простой (например, мой первый пример выше, основанный наsocket
) это не беспокоит keepalive (что довольно глупо для больших потоков).
И тогда я попробовал:
import time
import threading
import BaseHTTPServer
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
if self.path != '/':
self.send_error(404, "Object not found")
return
self.send_response(200)
self.send_header('Content-type', 'text/html; charset=utf-8')
self.end_headers()
# serve up an infinite stream
i = 0
while True:
self.wfile.write("%i " % i)
time.sleep(0.1)
i += 1
class Listener(threading.Thread):
def __init__(self, i):
threading.Thread.__init__(self)
self.i = i
self.daemon = True
self.start()
def run(self):
server_address = ('', 8000+self.i) # How to attach all of them to 8000?
httpd = BaseHTTPServer.HTTPServer(server_address, Handler)
httpd.serve_forever()
[Listener(i) for i in range(100)]
time.sleep(9e9)
что довольно хорошо, но немного раздражает, что мне нужно выделить 100 номеров портов. Это потребует отвратительного перенаправления на стороне клиента, чтобы перевести браузер на следующий доступный порт (хорошо, хорошо, я могу скрыть это с помощью JavaScript, но это не так элегантно. Я лучше напишу свой собственный HTTP-сервер, чем сделаю это).
Там должен быть чистый способ просто получить всеBaseHTTPServer
прослушиватели на одном порту, так как это такой стандартный способ настройки веб-сервера. Или, может бытьgunicorn
или какой-то такой пакет можно сделать так, чтобы он был надежно передан?