python - 如何在 python http.server 中同时提供文件夹和处理 POST 请求
问题描述
我正在运行一个 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
in./cgi-bin
并让客户发送 POST 请求到http://hostname:8080/cgi-bin/logger.py
. 并使用调用服务器python -m http.server --cgi 8080
但是,由于我对通过 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()
推荐阅读
- nunit - 使用 Specrun 并行运行 Specflow 功能
- angular - 我们如何检查 Angular 6 中的一些复选框
- php - 需要在 Lumen 中制作发票编号生成器
- css - CSS white-space: nowrap 导致溢出
- angular - 类型“TestHotObservable”缺少“主题”类型的以下属性
':观察者、关闭、isStopped、hasError 和另外 5 个 - node.js - Express/MongoDB 中的 HTTP 请求返回散列 id 和零值而不是 JSON 对象
- android - React Native apk 已安装但未显示在菜单中
- android - 谷歌地方将重点放在搜索栏上?
- arrays - Python 引用数组中的每个 JSON 元素
- email - 从 Microsoft Outlook 2010 获取服务器设置