Как обслуживать любой тип файла с помощью 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 и вы можете просматривать файлы (через каталог)