Python Простое http - отправка запроса GET - localhost: 8000 / example.zip и мой сервер отвечает файлом - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь реализовать простой 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)
...