Простой способ
Вы хотите расширить функциональность 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
и используете его впоследствии, иначе вы все равно будете подавать с /