2020-12-10

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'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值