如何在python http.server中同时为文件夹提供服务和处理POST请求
我正在运行一个https服务器,它使用以下代码为当前目录提供服务如何在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="/
#!/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应用程序,而是一个概念证明。