make_server() проверяет, успешно ли привязано к порту
В Python 2 и 3k, используя wsgi.simple_server.make_server(host, port, app)
не вызывает исключение, когда порт уже используется. Вместо этого вызов .server_forever()
или же .handle_request()
просто блокируется, пока другой порт не закроется и не будет установлено следующее соединение.
import wsgiref.simple_server as simple_server
def application(environ, start_response):
start_response('200 OK', [('Content-type', 'text/html')])
return ["<html><body><p>Hello!</p></body></html>".encode('utf-8')]
def main():
server = simple_server.make_server('', 8901, application)
server.serve_forever()
if __name__ == "__main__":
main()
Я ожидаю, что будет поднято исключение, так как socket.socket.bind()
Также возникает исключение в этом случае. Есть ли способ определить, вернулись ли HTTPServer
успешно связался с указанным портом?
1 ответ
Я нашел причину для этого. HTTPServer
Исходный код класса в Python 2.7.8 выглядит следующим образом:
class HTTPServer(SocketServer.TCPServer):
allow_reuse_address = 1 # Seems to make sense in testing environment
def server_bind(self):
"""Override server_bind to store the server name."""
import pdb; pdb.set_trace()
SocketServer.TCPServer.server_bind(self)
host, port = self.socket.getsockname()[:2]
self.server_name = socket.getfqdn(host)
self.server_port = port
А также allow_reuse_address
используется в SocketServer.TCPServer.server_bind()
как это:
class TCPServer(BaseServer):
# ...
def server_bind(self):
"""Called by constructor to bind the socket.
May be overridden.
"""
if self.allow_reuse_address:
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind(self.server_address)
self.server_address = self.socket.getsockname()
настройка allow_reuse_address
в False
вызовет self.socket.bind(self.server_address)
поднять исключение. Интересно, если эта строка в HTTPServer
класс является преднамеренным, поскольку в комментарии говорится, что он "имеет смысл в средах тестирования".