Python 基于SimpleHTTPRequestHandler的http服务端 – 启动和停止事件的回调
直接上代码
from http.server import SimpleHTTPRequestHandler
from http.server import HTTPServer
import io,shutil
class CallbackHTTPServer(HTTPServer):
def server_activate(self):
self.RequestHandlerClass.pre_start()
HTTPServer.server_activate(self)
self.RequestHandlerClass.post_start()
def server_close(self):
self.RequestHandlerClass.pre_stop()
HTTPServer.server_close(self)
self.RequestHandlerClass.post_stop()
class HttpHandler(SimpleHTTPRequestHandler):
@classmethod
def pre_start(cls):
print('Before calling socket.listen()')
@classmethod
def post_start(cls):
print( 'After calling socket.listen()')
@classmethod
def pre_stop(cls):
print( 'Before calling socket.close()')
@classmethod
def post_stop(cls):
print( 'After calling socket.close()')
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print('post data from client:')
print(post_data)
# response = {
# 'status': 'SUCCESS',
# 'data': 'server got your post data'
# }
# self.send_header("aaa","b")
# self.send_header("Content-type", 'application/json')
# self.send_header('Content-Disposition', 'attachment; filename=test.exe')
# self._set_headers()
# str = json.dumps(response).encode("utf-8")
# str = "HTTP/1.1 200 OK\r\nServer: wbsv1.38.1.360\r\nContent-Type: text/json; charset=utf-8\r\n" \
# "Content-Length: 50\r\nConnection: close\r\n\r\n" \
# "{\"result\":-100060,\"desc\":\"\",\"msgid\":0,\"custid\":\"\"}"
r_str = "Hello World"
enc = "UTF-8"
encoded = ''.join(r_str).encode(enc)
f = io.BytesIO()
f.write(encoded)
f.seek(0)
self.protocol_version = 'HTTP/1.1'
self.send_response(200)
self.send_header("Content-type", "application/json1; charset=%s" % enc)
# self.send_header("Content-Length", str(len(encoded)))
self.send_header("Content-Length", "{}".format(len(encoded)))
self.end_headers()
shutil.copyfileobj(f, self.wfile)
def main():
# Create server
try:
print( "Creating server")
server = CallbackHTTPServer(('', 8030), HttpHandler)
except KeyboardInterrupt:
print( "Server creation aborted")
return
# Start serving
try:
print( "Calling serve_forever()")
server.serve_forever()
except KeyboardInterrupt:
print( "Calling server.server_close()")
server.server_close()
if __name__ == '__main__':
main()
do_post中,http回应版本默认1.0
self.protocol_version = 'HTTP/1.1'