Служба каталогов в Python 3 - PullRequest
2 голосов
/ 08 марта 2019

У меня есть этот базовый сервер python3, но я не могу понять, как обслуживать каталог.

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
        def do_GET(self):
            print(self.path)
            if self.path == '/up':
                self.send_response(200)
                self.end_headers()
                self.wfile.write(b'Going Up')
            if self.path == '/down':
                self.send_response(200)
                self.end_headers()
                self.wfile.write(B'Going Down')

httpd = socketserver.TCPServer(("", PORT), SimpleHTTPRequestHandler)
print("Server started on ", PORT)
httpd.serve_forever()

Если вместо описанного выше пользовательского класса я просто передаю Handler = http.server.SimpleHTTPRequestHandler в TCPServer ():, функциональностью по умолчанию является обслуживание каталога, но я хочу обслуживать этот каталог и иметь функциональность на моих двух GET выше.

Например, если кто-то должен был перейти на localhost: 8080 / index.htmlЯ бы хотел, чтобы этот файл был им вручен

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Простой способ

Вы хотите расширить функциональность SimpleHTTPRequestHandler, чтобы вы подкласс это! Проверьте ваши особые условия, если ни одно из них не применимо, позвоните по номеру super().do_GET() и позвольте ему сделать все остальное.

Пример:

class MyHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/up':
            self.send_response(200)
            self.end_headers()
            self.wfile.write(b'up')
        else:
            super().do_GET()

Долгий путь

Чтобы обслуживать файлы, вам просто нужно открыть их, прочитать содержимое и отправить его. Для обслуживания каталогов (индексов) используйте os.listdir(). (При желании вы можете при получении каталогов сначала проверить файл index.html, а затем, если это не удастся, предоставить листинг индекса).

Вставка этого в ваш код даст вам:

class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        print(self.path)
        if self.path == '/up':
            self.send_response(200)
            self.end_headers()
            self.wfile.write(b'Going up')
        elif os.path.isdir(self.path):
            try:
                self.send_response(200)
                self.end_headers()
                self.wfile.write(str(os.listdir(self.path)).encode())
            except Exception:
                self.send_response(500)
                self.end_headers()
                self.wfile.write(b'error')
        else:
            try:
                with open(self.path, 'rb') as f:
                    data = f.read()
                self.send_response(200)
                self.end_headers()
                self.wfile.write(data)
            except FileNotFoundError:
                self.send_response(404)
                self.end_headers()
                self.wfile.write(b'not found')
            except PermissionError:
                self.send_response(403)
                self.end_headers()
                self.wfile.write(b'no permission')
            except Exception:
                self.send_response(500)
                self.end_headers()
                self.wfile.write(b'error')

В этом примере много ошибок. Вы могли бы хотеть переместить это куда-нибудь еще. Проблема в , который обслуживает ваш корневой каталог . Чтобы остановить это, вам нужно (простым способом) просто добавить каталог обслуживания в начало self.path. Также проверьте, если .. заставляет вас приземлиться выше, чем вы хотите. Способ сделать это - os.path.abspath(serve_from+self.path).startswith(serve_from)

Помещение внутрь (после проверки на / вверх):

class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        print(self.path)
        path = serve_from + self.path
        if self.path == '/up':
            self.send_response(200)
            self.end_headers()
            self.wfile.write(b'Going up')
        elif not os.path.abspath(path).startswith(serve_from):
            self.send_response(403)
            self.end_headers()
            self.wfile.write(b'Private!')
        elif os.path.isdir(path):
            try:
                self.send_response(200)
                self.end_headers()
                self.wfile.write(str(os.listdir(path)).encode())
            except Exception:
                self.send_response(500)
                self.end_headers()
                self.wfile.write(b'error')
        else:
            try:
                with open(path, 'rb') as f:
                    data = f.read()
                self.send_response(200)
                self.end_headers()
                self.wfile.write(data)
            # error handling skipped
            except Exception:
                self.send_response(500)
                self.end_headers()
                self.wfile.write(b'error')

Обратите внимание, что вы определили path и используете его впоследствии, иначе вы все равно будете подавать с /

1 голос
/ 08 марта 2019

если вы используете 3.7, вы можете просто обслуживать каталог, в котором находятся ваши html-файлы, например. index.html по-прежнему

python -m http.server 8080 --bind 127.0.0.1 --directory \your_directory\

для документов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...