Почему Python блокирует порт? И можно ли это безопасно использовать для простого подтверждения концепции живого приложения - PullRequest
0 голосов
/ 11 апреля 2020

Это интересно. Я сделал простой скрипт для привязки и обслуживания http , но я не сделал этого в Python3. Я могу написать простой сервер:

import http.server
import socketserver

PORT = 8002

Handler = http.server.SimpleHTTPRequestHandler
#https://docs.python.org/3/library/http.server.html
class MyHandler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, request, client_addr, server):
        super().__init__(request, client_addr, server)
    def do_GET(self, ):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.wfile.write('Hey!'.encode())

httpd = socketserver.TCPServer(("0.0.0.0", PORT), MyHandler)

print("serving at port", PORT)
httpd.serve_forever()

, но когда я его запускаю, то Ctrl + c, а затем запускаю его снова:

OSError: [Errno 98] Адрес уже в используйте

Почему, если я уничтожу предыдущий процесс?

Кроме того, есть ли какая-либо причина, кроме того, что это не может быть использовано в качестве простого тестируемого веб-приложения для тестового сервера в IP : port / somesamplewebapp - говорят, что «http.server не рекомендуется для производства. Он реализует только базовые c проверки безопасности». но если ему не нужен https или дополнительная безопасность ... каковы риски?

1 Ответ

0 голосов
/ 11 апреля 2020

Операционная система по умолчанию предотвращает повторное использование адреса с другим PID. Вы можете победить это с опцией сокета SO_REUSEADDR. Однако, так как вы используете класс TCPServer, и у него есть свой собственный, другой способ указать это. Вы можете использовать этот код.


import http.server
import socketserver

PORT = 8002

Handler = http.server.SimpleHTTPRequestHandler

#https://docs.python.org/3/library/http.server.html

class MyHandler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, request, client_addr, server):
        super().__init__(request, client_addr, server)

    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.wfile.write('Hey!'.encode())


class MyServer(socketserver.TCPServer):
    allow_reuse_address = True  # <-- This is what you need


httpd = MyServer(("0.0.0.0", PORT), MyHandler)

print("serving at port", PORT)

httpd.serve_forever()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...