Как обслуживать любой тип файла с помощью BaseHTTPRequestHandler Python

рассмотрим следующий пример:

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()

Что делать, если я хочу также сервер ZIP-файла... как мне это сделать? Я не думаю, что эта линия будет работать правильно?

self.wfile.write(f.read())

3 ответов


передать двоичный файл в качестве параметра функции Open(). Это:

f = open(curdir + sep + self.path, 'rb')

вместо этого:

f = open(curdir + sep + self.path)

UNIX не различает двоичный и текст, но windows делает это. Но если скрипт выполняется в UNIX, "b" будет просто проигнорирован, так что вы в безопасности.


ваша линия будет работать нормально. Проблема будет в установке Content-type надлежащим образом. Вы хотите установить его в application/zip вместо text/html.


Если вы хотите поделиться файлами в папке любого типа, вы также можете попробовать ввести команду

python -m SimpleHTTPServer

Это позволит запустить сервер на порту 8000 и вы можете просматривать файлы (через каталог)