Как обслуживать папку и обрабатывать POST-запросы одновременно в python http.server - PullRequest
2 голосов
/ 10 октября 2019

Я использую сервер https, который обслуживает текущий каталог, используя следующий код.

#!/usr/bin/env python3

from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl

httpd = HTTPServer(('hostname', 8443), SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile="/Users/test/Desktop/key.pem", certfile="/Users/test/Desktop/cert.pem", server_side=True)
httpd.serve_forever()

Я также хотел, чтобы сервер мог обрабатывать запрос POST с некоторыми значениями. Я хочу регистрировать все, что отправляется как POST в файл. Ранее я использовал сценарии cgi для этой цели. Я имел logger.py в ./cgi-bin и заставлял клиентов отправлять POST-запрос на http://hostname:8080/cgi-bin/logger.py. и вызвал сервер, используя python -m http.server --cgi 8080

Однако из-за моего нового требования обслуживать через https я больше не вызываю http.server из командной строки и использую приведенный выше скрипт. Я понятия не имею, POST-запросы могут быть обработаны без нарушения обычной функциональности обслуживания содержимого внутри папки.

1 Ответ

1 голос
/ 10 октября 2019

Немного погуглив, я решил проблему с помощью приведенного ниже кода.

#!/usr/bin/env python3

from http.server import HTTPServer, SimpleHTTPRequestHandler
from io import BytesIO
from sys import argv
import ssl


class requestHandler(SimpleHTTPRequestHandler):
    def do_POST(self):

        #Doing things with incoming POST data
        content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
        body = self.rfile.read(content_length) # <--- Gets the data itself
        bodydata = body.decode('utf-8')
        logdata = "\n"+bodydata+"\n"
        logfile = open('log.txt', 'a+')
        logfile.write(logdata)
        logfile.close()

        # Crafting the response to be sent back to client

        self.send_response(200)
        self.end_headers()
        response = BytesIO()
        response.write(b'\nA POST request with some data was recieved\n')
        response.write(b'The recieved data shall be logged\n')
        self.wfile.write(response.getvalue())

portstr = argv[1]
port = int(portstr)
keyloc = "/Users/test/Desktop/key.pem"
certloc = "/Users/test/Desktop/cert.pem"

httpd = HTTPServer(('localhost', port), requestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile=keyloc, certfile=certloc, server_side=True)
httpd.serve_forever()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...