HTTP-сервер Python обслуживает два пути, используя разные типы обработчиков - PullRequest
0 голосов
/ 27 октября 2019

Из других сообщений SO ясно, как обслуживать контент из определенного каталога и как сопоставлять входящий путь с различными обработчиками do_GET .

Чтобы подробно остановиться на втором вопросе, касающемся первого, как вы сопоставляете пути с различными типами обработчиков? В частности, я хотел бы сопоставить один путь с обработчиком do_GET, а другой - просто передать содержимое из определенного каталога.

Если это невозможно, как проще подать два разных типа содержимого? Я знаю, что эти два могут быть запущены на сервере в двух потоках, каждый из которых обслуживает другой порт, это не очень аккуратно.

1 Ответ

0 голосов
/ 03 ноября 2019

Я получил ответ, отследив код из первого справочного вопроса, на который ответил Jaymon , и включив код из второго справочного вопроса .

Образец следующий. Он обслуживает содержимое на локальном компьютере из каталога web/ по базовому пути URL /file/ и обрабатывает запросы с базовым путем URL /api в самом предоставленном пользователем методе do_GET(). Первоначально код был взят из образца в Интернете доктором Акселем Раушмайером .

#!/usr/bin/env python
# https://2ality.com/2014/06/simple-http-server.html
# https://stackoverflow.com/questions/39801718/how-to-run-a-http-server-which-serves-a-specific-path

from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer as BaseHTTPServer
import os

PORT = 8000

class HTTPHandler(SimpleHTTPRequestHandler):
    """This handler uses server.base_path instead of always using os.getcwd()"""
    def translate_path(self, path):
        if path.startswith(self.server.base_url_path):
            path = path[len(self.server.base_url_path):]
            if path == '':
                path = '/'
        else:
            #path = '/'
            return None
        path = SimpleHTTPRequestHandler.translate_path(self, path)
        relpath = os.path.relpath(path, os.getcwd())
        fullpath = os.path.join(self.server.base_local_path, relpath)
        return fullpath
    def do_GET(self):
        path = self.path
        if (type(path) is str or type(path) is unicode) and path.startswith('/api'):
            # call local handler
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            # Send the html message
            self.wfile.write("<b> Hello World !</b>")
            self.wfile.close()
            return
        elif (type(path) is str or type(path) is unicode) and path.startswith(self.server.base_url_path):
            return SimpleHTTPRequestHandler.do_GET(self)
        elif (type(path) is str or type(path) is unicode) and path.startswith('/'):
            self.send_response(441)
            self.end_headers()
            self.wfile.close()
            return
        else:
            self.send_response(442)
            self.end_headers()
            self.wfile.close()
            return

Handler = HTTPHandler
Handler.extensions_map.update({
    '.webapp': 'application/x-web-app-manifest+json',
});

class HTTPServer(BaseHTTPServer):
    """The main server, you pass in base_path which is the path you want to serve requests from"""
    def __init__(self, base_local_path, base_url_path, server_address, RequestHandlerClass=HTTPHandler):
        self.base_local_path = base_local_path
        self.base_url_path = base_url_path
        BaseHTTPServer.__init__(self, server_address, RequestHandlerClass)

web_dir = os.path.join(os.path.dirname(__file__), 'web')
httpd = HTTPServer(web_dir, '/file', ("", PORT))

print "Serving at port", PORT
httpd.serve_forever()

...