Простой HTTP-сервер на Python. Как получить файлы из 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()

person MAx Shvedov    schedule 05.07.2018    source источник


Ответы (1)


Кажется, я нашел проблему.

Это не работает, потому что:

self.path имеет символ / в строке, а path.join не может найти файл в Windows.

Вот фиксированная строка:

content_path = path.join(DIR_PATH, str(self.path)[1:])

str(self.path)[1:] удаляет первый символ (/) из строки self.path.

person MAx Shvedov    schedule 05.07.2018