简易python http数据读写服务

最近需要一个http服务中转一些数据,简单起见使用python搭建了个http数据读写服务

http_server.py

import os
import urllib
from http.server import HTTPServer, BaseHTTPRequestHandler


host = ('localhost', 10086)     # 主机名和端口号
data_path = '/tmp/http_data'    # 数据存储路径
if not os.path.exists(data_path):
    os.mkdir(data_path)


class Request(BaseHTTPRequestHandler):
    timeout = 5
    server_version = "Apache"  # 设置服务器返回的的响应头

    def do_GET(self):
        # 解析请求参数
        parse = urllib.parse.urlparse(self.path)
        path = parse.path
        query = parse.query
        query_dict = dict([(k, v[0]) for k, v in urllib.parse.parse_qs(query, True).items()])
        # 过滤非法请求
        illegal = False
        if not query_dict:
            illegal = True
        for k, v in query_dict.items():
            if '..' in k:
                illegal = True
            if k.startswith('/') or k.startswith('\\'):
                illegal = True
            if not os.path.abspath(os.path.join(data_path, k)).startswith(data_path):
                illegal = True
        if illegal:
            self.send_error(403)
            return
        # 处理请求
        data = {}
        if path == '/r':
            for k, v in query_dict.items():
                loc_path = os.path.join(data_path, k)
                if os.path.exists(loc_path):
                    with open(loc_path, 'r') as f:
                        data[k] = f.read()
                else:
                    data[k] = ''
        elif path == '/w':
            for k, v in query_dict.items():
                loc_path = os.path.join(data_path, k)
                with open(loc_path, 'w') as f:
                    f.write(v)
        else:
            self.send_error(403)
            return
        # 返回结果
        self.send_response(200)
        self.send_header("Content-type", "json")
        self.end_headers()
        self.wfile.write(str(data).encode())


if __name__ == '__main__':
    server = HTTPServer(host, Request)
    print("Starting server, listen at: %s:%s" % host)
    server.serve_forever()

启动命令:

python http_server.py

提交数据:

http://localhost:10086/w?k1=v1&k2=v2

读取数据:

http://localhost:10086/r?k1&k2

你可能感兴趣的:(网络编程,python,http,网络)