Я пытаюсь реализовать простой HTTP-сервер для школьного проекта. Идея заключается в том, что будет HTTP-сервер, который будет принимать файлы, отправленные с помощью запроса POST, и сохранять их. И при отправке запросов GET (например, localhost: 8000 / example.zip) сервер ответит запрошенным файлом (example.zip). Я выбрал Python, и для моей серверной архитектуры это простой http-сервер, который кажется самым простым. Я также попытался поэкспериментировать с Flask, но не смог заставить его работать. Моя клиентская архитектура не работает в Python.
Я уже внедрил и запустил POST. Если я отправлю файл с запросом POST, мой HTTP-сервер успешно сохранит его. Тем не менее, я не могу заставить работать. Как я уже упоминал, при загрузке определенного файла, скажем, example.zip, я хочу иметь возможность загружать этот файл с помощью запроса GET.
Не могли бы вы помочь мне реализовать мой обработчик запросов GET?
Спасибо. Ниже мой код с запущенным POST и не работающим GET.
import argparse
from http.server import HTTPServer, BaseHTTPRequestHandler
from shutil import copyfileobj
from os import path as ospath
import cgi
import cgitb; cgitb.enable(format="text")
from io import StringIO
import urllib
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
def _html(self, message):
"""This just generates an HTML document that includes `message`
in the body. Override, or re-write this do do more interesting stuff.
"""
content = f"<html><body><h1>{message}</h1></body></html>"
return content.encode("utf8") # NOTE: must return a bytes object!
def do_GET(self):
self._set_headers()
self.wfile.write(self._html("hi!"))
def do_HEAD(self):
self._set_headers()
def do_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD':'POST',
'CONTENT_TYPE':self.headers['Content-Type'],
})
filename = form['file'].filename
data = form['file'].file.read()
open(filename, "wb").write(data)
self._set_headers()
self.wfile.write(self._html("hi!"))
def run(server_class=HTTPServer, handler_class=S, addr="localhost", port=8000):
server_address = (addr, port)
httpd = server_class(server_address, handler_class)
print(f"Starting httpd server on {addr}:{port}")
httpd.serve_forever()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Run a simple HTTP server")
parser.add_argument(
"-l",
"--listen",
default="localhost",
help="Specify the IP address on which the server listens",
)
parser.add_argument(
"-p",
"--port",
type=int,
default=8000,
help="Specify the port on which the server listens",
)
args = parser.parse_args()
run(addr=args.listen, port=args.port)