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

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

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

person carrier    schedule 07.07.2009    source источник
comment
Может ли кто-нибудь объяснить, почему вызов open() потенциально делает каждый файл на вашем компьютере читаемым? И как бы вы защитились от этого для обслуживания файлов в этом примере?   -  person brooksbp    schedule 29.10.2011
comment
@brooksbp Я думаю, он имеет в виду, что пользователь может ввести путь, по которому можно будет перейти в другой каталог на вашем компьютере, например, перейти вверх по одному или нескольким каталогам. Но с помощью приведенного выше кода можно было получить доступ только к файлам html.   -  person Anthony    schedule 26.01.2016


Ответы (3)


Передайте двоичный файл в качестве параметра для open(). Этот:

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

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

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

UNIX не различает двоичные и текстовые файлы, а Windows различает. Но если сценарий выполняется в UNIX, буква «b» будет просто проигнорирована, так что вы в безопасности.

person JosefAssad    schedule 07.07.2009
comment
А в Python 3 Python делает различие между бинарными и текстовыми файлами, так что вы можете поставить правильный флаг уже сейчас. :) - person Lennart Regebro; 07.07.2009

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

person Eli Courtwright    schedule 07.07.2009
comment
это правда, но я уже сделал это. Джозеф Асад определил мою проблему. Но ты прав. - person carrier; 07.07.2009

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

python -m SimpleHTTPServer

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

person nibin012    schedule 23.07.2011