Возможно ли использование 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`