Простой HTTP-сервер в Pyhton. Как получить файлы из DIR_PATH?
У меня есть такой код для запуска простого сервера на Python 3. Я знаю, что я могу просто использовать что-то вроде этого python -m http.server 8080
Тем не менее, я хочу понять, как это работает и установить ограничения для обслуживания файлов расширений.
Я пытаюсь использовать path.join(DIR_PATH, self.path)
, но кажется, что не работает.
>> FileNotFoundError: [WinError 2]: 'c:/test.html'
Но DIR_PATH = 'C:\script_path\src\'
Однако это работает для /
запрошенный путь и сервер открывается index.html
,
Следовательно, path.join(DIR_PATH, 'index.html')
это работает.
from http.server import BaseHTTPRequestHandler, HTTPServer
from os import path
DIR_PATH = path.abspath(path.dirname(__file__))
hostName = "localhost"
hostPort = 8080
class RequestHandler(BaseHTTPRequestHandler):
content_type = 'text/html'
def _set_headers(self):
self.send_response(200)
self.send_header('Content-Type', self.content_type)
self.send_header('Content-Length', path.getsize(self.getPath()))
self.end_headers()
def do_GET(self):
self._set_headers()
self.wfile.write(self.getContent(self.getPath()))
def getPath(self):
if self.path == '/':
content_path = path.join(DIR_PATH, 'index.html')
else:
content_path = path.join(DIR_PATH, self.path)
return content_path
def getContent(self, content_path):
with open(content_path, mode='r', encoding='utf-8') as f:
content = f.read()
return bytes(content, 'utf-8')
myServer = HTTPServer((hostName, hostPort), RequestHandler)
myServer.serve_forever()
1 ответ
Кажется, я нашел проблему.
Это не работает, потому что:
self.path
имеет /
символ в строке и path.join
не могу найти файл в Windows.
Вот фиксированный ряд:
content_path = path.join(DIR_PATH, str(self.path)[1:])
str(self.path)[1:]
удаляет первый символ (/
) из self.path
строка.