如何在python http.server中同时为文件夹提供服务和处理POST请求

如何在python http.server中同时为文件夹提供服务和处理POST请求,python,python-3.x,http,https,Python,Python 3.x,Http,Https,我正在运行一个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="/

我正在运行一个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脚本。我以前在
/cgi-bin
中有一个
logger.py
,并让客户端向
http://hostname:8080/cgi-bin/logger.py
。并使用
python-mhttp.server--cgi8080


但是,由于我的新要求是通过https提供服务,我不再从命令行调用http.server,而是使用上面的脚本。我不知道在不破坏文件夹内内容服务的常规功能的情况下,可以处理POST请求。

通过更多的谷歌搜索,我用下面的代码解决了这个问题

#!/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()
#/usr/bin/env蟒蛇3
从http.server导入HTTPServer,SimpleHTTPRequestHandler
从io导入字节io
从系统导入argv
导入ssl
类requestHandler(SimpleHTTPRequestHandler):
def do_POST(自我):
#处理传入的POST数据

content_length=int(self.headers['content-length'])#当然,我很高兴您能够使用这些较低级别的库实现这一点。但在未来,您可能会通过尝试Python目前提供的众多高级web框架中的一个来为自己节省一些麻烦。Flask是最受欢迎的软件之一,但还有许多其他软件。@iGuanaaut我试图用最少的资源来完成它,因为这不是一个成熟的web应用程序,而是一个概念证明。