2009-07-07 8 views
9

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

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

+0

@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

Odpowiedz

8

Przekaż plik binarny jako parametr otwierający(). To:

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

Zamiast tego:

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

UNIX nie rozróżnia binarne i tekstu, ale okna nie. Ale jeśli skrypt zostanie uruchomiony w systemie UNIX, "b" zostanie po prostu zignorowane, abyś był bezpieczny.

+0

Plus Odpowiedź Eli Courtwright. – JosefAssad

+2

W Pythonie 3 Python robi różnicę między plikami binarnymi i tekstowymi, więc równie dobrze możesz umieścić poprawną flagę już teraz. :) –

+0

Geniusz! Dzięki! – carrier

4

Twoja linia będzie działać dobrze. Problem polegałby na odpowiednim ustawieniu wartości Content-type. Chcesz ustawić go na application/zip zamiast na text/html.

+1

To prawda, ale już to zrobiłem. JosefAssad zidentyfikował problem, który miałem. Ale masz rację. – carrier

4

Jeśli chcesz udostępnić pliki w folderze z dowolnego typu, to można też spróbować wpisując komendę

python -m SimpleHTTPServer 

Spowoduje to uruchomienie serwera na porcie 8000 i można przeglądać pliki (poprzez listy katalogów)

Powiązane problemy