python 3.6 BaseHTTPRequestHandler
python 3.6 BaseHTTPRequestHandler
我正在努力成为一名服务器程序员。代码如下所示:
class ALNHTTPRequestHandler(BaseHTTPRequestHandler):
prefix = r'/Users/huxx/PycharmProjects/ServerDemo'
# handle GET command
def do_GET(self):
rootdir = ALNHTTPRequestHandler.prefix # file location
try:
if self.path.endswith('.html'):
finalPath = rootdir + self.path
with open(finalPath, 'rb') as f:
print('open successed')
# send code 200 response
self.send_response(200)
# send header first
self.send_header('Content-type', 'text-html')
self.end_headers()
# send file content to client
a = f.read()
self.wfile.write(a)
# self.wfile.write(f.read())
return
except IOError:
print('well not found')
self.send_error(404, 'file not foundbbbb')
def run():
print('http server is starting...')
server_address = ('127.0.0.1', 8011)
httpd = HTTPServer(server_address,ALNHTTPRequestHandler)
print('http server is running...')
httpd.serve_forever()
if __name__ == '__main__':
run()
问题是如果我使用 self.wfile.write(f.read()) 而不是 self.wfile.write(a),则根本没有响应。这是为什么?
这与read()
方法的工作原理有关。首先,让我们关注这一行:
self.wfile.write(f.read())
read()
基本上读取了您的 file-like 对象 (f
),并且在完成此方法的调用后,指针停留在内存地址的末尾。您可以将其想象为对文件的 "read-once" 操作。在那之后,write()
调用开始并且没有什么可写的(因为指针在末尾),因此似乎没有响应。现在让我们看看替代方案:
a = f.read()
self.wfile.write(a)
在这种情况下,您将数据从 f.read()
读取到内存中,它作为字符串保留在变量 a
中。您以后可以根据需要多次读取此变量(除非您删除它),这正是后续 write()
调用所做的。
我正在努力成为一名服务器程序员。代码如下所示:
class ALNHTTPRequestHandler(BaseHTTPRequestHandler):
prefix = r'/Users/huxx/PycharmProjects/ServerDemo'
# handle GET command
def do_GET(self):
rootdir = ALNHTTPRequestHandler.prefix # file location
try:
if self.path.endswith('.html'):
finalPath = rootdir + self.path
with open(finalPath, 'rb') as f:
print('open successed')
# send code 200 response
self.send_response(200)
# send header first
self.send_header('Content-type', 'text-html')
self.end_headers()
# send file content to client
a = f.read()
self.wfile.write(a)
# self.wfile.write(f.read())
return
except IOError:
print('well not found')
self.send_error(404, 'file not foundbbbb')
def run():
print('http server is starting...')
server_address = ('127.0.0.1', 8011)
httpd = HTTPServer(server_address,ALNHTTPRequestHandler)
print('http server is running...')
httpd.serve_forever()
if __name__ == '__main__':
run()
问题是如果我使用 self.wfile.write(f.read()) 而不是 self.wfile.write(a),则根本没有响应。这是为什么?
这与read()
方法的工作原理有关。首先,让我们关注这一行:
self.wfile.write(f.read())
read()
基本上读取了您的 file-like 对象 (f
),并且在完成此方法的调用后,指针停留在内存地址的末尾。您可以将其想象为对文件的 "read-once" 操作。在那之后,write()
调用开始并且没有什么可写的(因为指针在末尾),因此似乎没有响应。现在让我们看看替代方案:
a = f.read()
self.wfile.write(a)
在这种情况下,您将数据从 f.read()
读取到内存中,它作为字符串保留在变量 a
中。您以后可以根据需要多次读取此变量(除非您删除它),这正是后续 write()
调用所做的。