如何使用Python的BaseHTTPRequestHandler提供任何文件类型

car*_*ier 11 python httpserver

请考虑以下示例:

import string,cgi,time
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        try:
            if self.path.endswith(".html"):
                f = open(curdir + sep + self.path) #self.path has /test.html
#note that this potentially makes every file on your computer readable by the internet

                self.send_response(200)
                self.send_header('Content-type',    'text/html')
                self.end_headers()
                self.wfile.write(f.read())
                f.close()
                return

        except IOError:
            self.send_error(404,'File Not Found: %s' % self.path)


def main():
    try:
        server = HTTPServer(('', 80), MyHandler)
        print 'started httpserver...'
        server.serve_forever()
    except KeyboardInterrupt:
        print '^C received, shutting down server'
        server.socket.close()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

如果我想要一个ZIP文件服务器怎么办...我该怎么做?我不认为这条线能正常工作吗?

self.wfile.write(f.read())
Run Code Online (Sandbox Code Playgroud)

Jos*_*sad 9

将二进制文件作为参数传递给open().这个:

f = open(curdir + sep + self.path, 'rb')
Run Code Online (Sandbox Code Playgroud)

而不是这个:

f = open(curdir + sep + self.path)
Run Code Online (Sandbox Code Playgroud)

UNIX不区分二进制文本和文本,但Windows确实如此.但是如果脚本在UNIX上执行,那么"b"将被忽略,因此您是安全的.

  • 在Python 3中,Python在二进制文件和文本文件之间有所区别,所以你现在也可以在那里放置正确的标志.:) (2认同)