解决方案:BaseHttpServer 返回 404 代码的问题

47 阅读1分钟

在使用 BaseHttpServer 时,遇到了一个问题,当路径中包含西里尔字母时,总是返回 404 代码。

2. 解决方案

huake_00257_.jpg 为了解决这个问题,需要在处理请求的代码中添加必要的编码支持。具体来说,需要将路径解码为 UTF-8 编码,然后才能使用它来打开文件。

# ...
def do_GET(self):
    self.performReq(self.path.decode('utf8'))

# ...

此外,还需要在发送头部信息时,指定 Content-Type 为 text/xml,并指定字符集为 UTF-8。

# ...
ext = os.path.splitext(self.path)[1]
self.send_header('Content', 'text/xml; charset=UTF-8')
self.end_headers()
# ...

代码例子

class ReqHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def __init__(self, request, client_address, server):
        BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server)

    def do_GET(self):
        self.performReq(self.path.decode('utf8'))

    def performReq(self, req):
        curDir = os.getcwd()
        fname = curDir + '/' + self.path[1:]
        try:
            self.send_response(200, "Ok!")
            ext = os.path.splitext(self.path)[1]
            self.send_header('Content', 'text/xml; charset=UTF-8')
            self.end_headers()
            f = open(fname, 'rb')
            for l in f:
                self.wfile.write(l)
            f.close()
            print('file ' + fname + " Ok")
        except IOError:
            print('no file ' + fname)
            self.send_error(404)


if __name__ == '__main__':
    server = BaseHTTPServer.HTTPServer(('', 8081), ReqHandler)
    print('server ok!')
    server.serve_forever()

问题背景

在使用 BaseHttpServer 时,遇到了一个问题,当路径中包含西里尔字母时,总是返回 404 代码。

解决方案

为了解决这个问题,需要在处理请求的代码中添加必要的编码支持。具体来说,需要将路径解码为 UTF-8 编码,然后才能使用它来打开文件。

# ...
def do_GET(self):
    self.performReq(self.path.decode('utf8'))

# ...

此外,还需要在发送头部信息时,指定 Content-Type 为 text/xml,并指定字符集为 UTF-8。

# ...
ext = os.path.splitext(self.path)[1]
self.send_header('Content', 'text/xml; charset=UTF-8')
self.end_headers()
# ...

代码例子

class ReqHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def __init__(self, request, client_address, server):
        BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server)

    def do_GET(self):
        self.performReq(self.path.decode('utf8'))

    def performReq(self, req):
        curDir = os.getcwd()
        fname = curDir + '/' + self.path[1:]
        try:
            self.send_response(200, "Ok!")
            ext = os.path.splitext(self.path)[1]
            self.send_header('Content', 'text/xml; charset=UTF-8')
            self.end_headers()
            f = open(fname, 'rb')
            for l in f:
                self.wfile.write(l)
            f.close()
            print('file ' + fname + " Ok")
        except IOError:
            print('no file ' + fname)
            self.send_error(404)


if __name__ == '__main__':
    server = BaseHTTPServer.HTTPServer(('', 8081), ReqHandler)
    print('server ok!')
    server.serve_forever()