Возможно ли использование html-файла localhost с http-модулем python, например, django

Так что я пытался сделать localhost с http.server я использовал некоторые помощи из документации, но я получил ошибку я пытался исправить все еще не в состоянии исправить его вот код:

from http.server import BaseHTTPRequestHandler, HTTPServer
loop = True
def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('result.html', 5050)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
    if loop == True:
        httpd.server_close()




while loop:
    run()
    ex = input("To close the server write 'exit' /n <<< ")
    if ex.find(f'exit'):
        loop = False

Ошибка:

Traceback (most recent call last):
  File "E:\Python\localhost\main.py", line 36, in <module>
    run()
  File "E:\Python\localhost\main.py", line 5, in run
    httpd = server_class(server_address, handler_class)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\socketserver.py", line 457, in __init__
    self.server_bind()
  File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\http\server.py", line 136, in server_bind
    socketserver.TCPServer.server_bind(self)
  File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\socketserver.py", line 473, in server_bind
    self.socket.bind(self.server_address)
socket.gaierror: [Errno 11001] getaddrinfo failed

Process finished with exit code 1

В вашем коде много ошибок. Это также показывает, что вы не знаете, как работают (веб-) серверы.

Но лучше я покажу, как использовать http самым простым способом.

Если вы хотите обслуживать файлы в текущей папке, то самый простой способ - запустить в системной консоли (терминал/bash/powershell/etc)

python3 -m http.server 5050

и запустит встроенную функцию, которая запустит простой веб-сервер.

Это будет показано в консоли

Serving HTTP on 0.0.0.0 port 5050 (http://0.0.0.0:5050/) ...

и вы можете скопировать адрес http://0.0.0.0:5050/ в веб-браузер, чтобы подключиться к этому серверу.
В некоторых консолях вы можете даже нажать на текст с адресом, и система откроет его в веб-браузере
. (на некоторых терминалах может потребоваться нажать клавишу Ctrl при нажатии)

Если в текущей папке есть файл index.html, то он покажет вам этот файл.

Если у вас нет index.html, то он покажет вам список всех файлов и подпапок в текущих папках, и вы можете щелкнуть result.html, чтобы отобразить его. Если щелкнуть папку, то должны отобразиться файлы в этой папке, но если в этой папке есть файл index.html, то отобразится index.html

Поэтому иногда использование имени index.html может упростить задачу.
И это может скрыть файлы, которые у вас есть в папке.


Если вы хотите обслуживать файлы из другой папки, то используйте

python3 -m http.server 5050 -d /path/to/other/directory

Если вы все еще хотите писать код, то у вас есть ошибки:

  • server_address должен использовать IP address (как 127.0.0.1) или доменное имя (как localhost) без пути с именем файла и/или папки, потому что эта информация обрабатывается в обработчике.

  • BaseHTTPRequestHandler не может быть использован напрямую, потому что у него нет функции do_GET() (и в конечном итоге do_POST()). Вы должны использовать этот класс для создания собственного обработчика и добавить функцию do_GET()

     class MyHandler(BaseHTTPRequestHandler): 
          def do_GET(self): 
              ...
    

    Он будет запускать эту функцию для каждого пути в URL, например /result.html, и вы получите его в self.path - и вам нужно будет решить, что делать с этим путем

  • serve_forever() выполняется вечно и блокирует следующие строки - поэтому использование input() и while-петли бесполезно. Вы должны использовать ключи Ctrl+C для остановки сервера.

Полный рабочий пример:

from http.server import HTTPServer, BaseHTTPRequestHandler
import os

class MyHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        print('path:', self.path)
        
        if os.path.exists('result.html'):
            with open('result.html', 'rb') as f:  # bytes, not string
                data = f.read()
                
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
            self.wfile.write(data,)

        else:
            data = b"Not found: result.html"   # bytes, not string
            
            self.send_response(404)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            self.wfile.write(data,)
            
        return
        
#server_address = ('localhost', 5050)  # access only from current computer
server_address = ('127.0.0.1', 5050)  # access only from current computer
#server_address = ('0.0.0.0', 5050)  # access from all computers in local network (if firewall doesn't stop it)

httpd = HTTPServer(server_address, MyHandler)

print(f"Running http://{server_address[0]}:{server_address[1]}")
print("Press Ctrl+C to stop it")

try:
    httpd.serve_forever()
except KeyboardInterrupt:
    print("\rStopping")    # `\r` to remove `^C` from screen`
Вернуться на верх