Rozważmy następujący przykład:Jak obsługiwać dowolny typ pliku z Pythona 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()
Co jeśli chcę serwerze plik ZIP również ... w jaki sposób to zrobić? Nie sądzę, aby ta linia działała poprawnie?
self.wfile.write(f.read())
Czy ktoś może wyjaśnić, dlaczego wywołanie funkcji open() "potencjalnie sprawia, że każdy plik na komputerze jest czytelny"? Jak można to zabezpieczyć przed serwowaniem plików w tym przykładzie? – brooksbp
@brooksbp Myślę, że oznacza to, że użytkownik może wpisać ścieżkę, która będzie nawigować do innego katalogu na komputerze, na przykład do jednego lub więcej katalogów. Ale dostęp do plików html można uzyskać tylko za pomocą powyższego kodu. – Anthony