Как запустить HTTP-сервер, который обслуживает определенный путь?
это мой проект Python3 hiearchy:
projet
\
script.py
web
\
index.html
От script.py
, я хотел бы запустить http-сервер, который обслуживает содержимое папки web
.
Здесь предлагается этот код для запуска простого http-сервера:
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()
но это на самом деле служит project
, а не web
. Как указать путь к папке, которую я хочу обслуживать?
Ответы
Ответ 1
https://docs.python.org/3/library/http.server.html#http.server.SimpleHTTPRequestHandler
Этот класс обслуживает файлы из текущего каталога и ниже, непосредственно сопоставление структуры каталогов с HTTP-запросами.
Так что вам просто нужно изменить текущий каталог до запуска сервера - см. os.chdir
например:
import http.server
import socketserver
import os
PORT = 8000
web_dir = os.path.join(os.path.dirname(__file__), 'web')
os.chdir(web_dir)
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()
Ответ 2
Если вы просто хотите использовать статический файл, вы можете сделать это, запустив модуль SimpleHTTPServer, используя python 2:
python -m SimpleHTTPServer
Или с питоном 3:
python3 -m http.server
Таким образом, вам не нужно писать сценарий.
Ответ 3
В Python 3.7 SimpleHTTPRequestHandler
может принимать аргумент directory
:
import http.server
import socketserver
PORT = 8000
DIRECTORY = "web"
class Handler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=DIRECTORY, **kwargs)
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
и из командной строки:
python -m http.server --directory web
Чтобы немного сойти с ума... вы можете сделать обработчики для произвольных каталогов:
def handler_from(directory):
def _init(self, *args, **kwargs):
return http.server.SimpleHTTPRequestHandler.__init__(self, *args, directory=self.directory, **kwargs)
return type(f'HandlerFrom<{directory}>',
(http.server.SimpleHTTPRequestHandler,),
{'__init__': _init, 'directory': directory})
with socketserver.TCPServer(("", PORT), handler_from("web")) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
Ответ 4
Просто для полноты, здесь, как вы можете настроить фактические классы серверов для обслуживания файлов из произвольного каталога:
try
# python 2
from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer as BaseHTTPServer
except ImportError:
# python 3
from http.server import HTTPServer as BaseHTTPServer, SimpleHTTPRequestHandler
class HTTPHandler(SimpleHTTPRequestHandler):
"""This handler uses server.base_path instead of always using os.getcwd()"""
def translate_path(self, path):
path = SimpleHTTPRequestHandler.translate_path(self, path)
relpath = os.path.relpath(path, os.getcwd())
fullpath = os.path.join(self.server.base_path, relpath)
return fullpath
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_path, server_address, RequestHandlerClass=HTTPHandler):
self.base_path = base_path
BaseHTTPServer.__init__(self, server_address, RequestHandlerClass)
Затем вы можете установить любой произвольный путь в вашем коде:
web_dir = os.path.join(os.path.dirname(__file__), 'web')
httpd = HTTPServer(web_dir, ("", 8000))
httpd.serve_forever()
Ответ 5
Есть более короткий метод:
Handler = functools.partial(http.server.SimpleHTTPRequestHandler, directory='/my/dir/goes/here')