在使用 BaseHttpServer 时,遇到了一个问题,当路径中包含西里尔字母时,总是返回 404 代码。
2. 解决方案
为了解决这个问题,需要在处理请求的代码中添加必要的编码支持。具体来说,需要将路径解码为 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()