Сервер Python SSL выдает мне «501 Неподдерживаемый метод GET».

#python #python-3.x #simplehttpserver

#python #python-3.x #simplehttpserver

Вопрос:

Я перешел по этой ссылке, чтобы создать простой файловый сервер с SSL.

 from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

httpd = HTTPServer(('localhost', 4443), BaseHTTPRequestHandler)

# openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
httpd.socket = ssl.wrap_socket (httpd.socket, keyfile="key.pem", certfile='cert.pem', server_side=True)

httpd.serve_forever()
 

Я успешно создал сертификат, key.pem и cert.pem пути к файлам указаны, и я могу запустить сервер с помощью python server.py . Меня просят ввести пароль, вводят его, затем он на некоторое время зависает, а затем, кажется, запускается.

Однако, когда я ввожу какой-либо URL, например, https://localhost:4443/index.html я получаю 500 неподдерживаемых методов GET. Объяснение кода ошибки: HttpStatus.NOT_IMPLEMENTED — сервер не поддерживает эту операцию.Нужно ли мне сделать что-то еще, чтобы мой сервер обслуживал текущий каталог? До сих пор я только что использовал python -m http.server 8000 ( SimpleHTTPServer когда на Mac.) Я использую Python 3.

Это будет оставаться локальным, поэтому не беспокойтесь о PEM том, что файлы и серверный скрипт будут доступны через него (если это сработает!). Я также согласен с ненадежным сертификатом и дал указание Chrome посетить страницу в любом случае. Мне это просто нужно, чтобы я мог получить доступ к camera без необходимости развертывания моего приложения где-либо с законным сертификатом.

Комментарии:

1. Ссылка содержит код, который не является законным для python3. То, что вам нужно, это SimpleHTTPRequestHandler, и вы пытаетесь использовать BaseHTTPRequestHandler, так что, возможно, это фиктивная статья, и не так просто, как утверждает автор. Попробовал заставить это работать, но это не сработало для python 2 или 3, следуя ссылке. СДЕЛАЙ сам!

Ответ №1:

Из документов:

класс http.server.BaseHTTPRequestHandler(запрос, client_address, сервер)

Этот класс используется для обработки HTTP-запросов, поступающих на сервер. Сам по себе он не может отвечать на какие-либо фактические HTTP-запросы; он должен быть подклассом для обработки каждого метода запроса (например, GET или POST).

Попробуйте вместо этого использовать SimpleHTTPRequestHandler, например,

 httpd = socketserver.TCPServer(('localhost', 4443), SimpleHTTPRequestHandler)