2016-06-06 11 views
2

Ich mag die einfache Bedienung von Python Simple aber ...Python Einfache HTTP-Server in Virtual Directory

Ich mag würde, es zu starten, was ich ein „fake Verzeichnis“ bin Aufruf - das heißt, ein Verzeichnis, das nur aus der Sicht des Servers existiert (nicht wirklich auf dem Computer vorhanden) und nicht mehr existiert, wenn der Python-Prozess, der den Server ausführt, aufhört. Ich könnte auch mit einem temporären Verzeichnis machen, aber ich möchte garantieren, dass dieses Verzeichnis nachher gelöscht wird (also akkumuliere ich nicht jedes Mal, wenn ich das ausführe, und denke darüber nach, sie manuell zu löschen).

Weiß jemand, was der beste Weg ist, dies zu tun?

+0

Sie dienen Dateien lokal mit Python -m Simplehttpserver oder etwas komplizierter (über Handler etc) tun? –

+0

Ich liefere Dateien lokal (obwohl ich den SimpleHTTPServer nicht in seinem eigenen Prozess wie in Ihrem Befehl starte, starte ich es in einem Thread.) – Peter

+0

Sie sollten das als ein bisschen Info zu der Frage hinzufügen. Ich habe eine Antwort auf die Frage basierend auf den Informationen in den Kommentaren hinzugefügt. Ich hoffe es hilft. –

Antwort

1

Ich würde dies tun, indem Sie eine SQL-In-Memory-Datenbank verwenden. Sie erhalten alle Vorteile einer SQL-Datenbank (Relationen, Durchsuchbarkeit usw.), aber sie existiert nur für die Lebensdauer des Prozesses.

Sie können das Paket libsqlfs verwenden, das ein vollständiges POSIX-Dateisystem emuliert, oder Sie können Ihre eigenen mit ein paar einfachen Tabellen erstellen, um Verzeichnisse und Dateien zu speichern. Es hängt davon ab, wie gründlich Sie ein tatsächliches Dateisystem emulieren möchten.

1

Sie könnten TemporaryDirectory oder mkdtemp verwenden und den Server von diesem Verzeichnis aus bedienen lassen. Bei der ersten Vorgehensweise und wenn Sie als Kontextmanager verwendet werden, erhalten Sie eine automatische Bereinigung.

Alternativ können Sie versuchen, alles in einem Containersystem wie Docker auszuführen. Auf diese Weise erhalten Sie eine Isolation aller Operationen innerhalb des Containers und dessen Sicht auf das Dateisystem und erlauben nur die gewünschten Änderungen. Es ist eine Art schwere Waffe, die man benutzen kann.

1

Hier ist ein Ausschnitt davon, was Sie mit mkdtemp erreichen könnten. Es entfernt keine Dateien, wenn der Python-Prozess beendet wird. Vielleicht könnte ein Signal-Handler die Arbeit machen.

import SimpleHTTPServer 
import tempfile 
import os 
import shutil 

class CustomHTTPServer(): 
    pass 

if __name__ == '__main__': 
    tmpdir = tempfile.mkdtemp() 
    try: 
     print "Serving files under %s" % tmpdir 
     os.chdir(tmpdir) 
     SimpleHTTPServer.test() 
    except Exception: 
     pass 
    finally: 
     shutil.rmtree(tmpdir) 

die Sie nur mit python -m CustomHTTPServer aufrufen können.

0

Sie könnten von Simple erben und überschreiben die Methode list_directory und translate_path, aber wenn Sie wirklich nichts ausmacht, auf Disc Dumping, könnten Sie sich ein temporäres Verzeichnis-Kontext-Manager machen das Verzeichnis löschen mit shutil behandelt:

from tempfile import mkdtemp 
import shutil 

class TempDir(object): 
    def __init__(self, *args, **kwargs): 
     self.args = args 
     self.kwargs = kwargs 

    def __enter__(self): 
     self.tempdir = mkdtemp(*self.args, **self.kwargs) 
     return self.tempdir 

    def __exit__(self, *args): 
     return shutil.rmtree(self.tempdir) 

Und dann servieren Sie es mit SimpleHTTPServer.

+0

Ich fing an, dies zu schreiben, als es noch keine Antworten darauf gab, es scheint, ich war zu langsam! –