首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3.6 BaseHTTPRequestHandler

Python3.6 BaseHTTPRequestHandler
EN

Stack Overflow用户
提问于 2018-03-15 08:59:53
回答 1查看 359关注 0票数 0

我在试着做一个服务器程序。代码看起来是这样的:

代码语言:javascript
复制
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),那么根本就没有响应。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-15 11:46:17

这与read()方法的工作方式有关。首先,让我们关注这一行:

代码语言:javascript
复制
self.wfile.write(f.read())

read()基本上读取您的类文件对象(f),在完成此方法的调用之后,指针将停留在内存地址的末尾。您可以将其想象为文件的“读一次”操作。之后,write()调用启动,没有什么可写的(因为指针在末尾),因此似乎没有响应。现在让我们看看另一种选择:

代码语言:javascript
复制
a = f.read()
self.wfile.write(a)

在本例中,您将数据从f.read()读取到内存,并且它在变量a中保持为字符串。以后,您可以根据需要多次读取这个变量(除非您删除它),这正是后续write()调用所做的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49295099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档