2

Ich muss einen Parameter an SimpleHTTPRequestHandler-Klasse übergeben, also habe ich Klassenfactory verwendet, um einen benutzerdefinierten Handler wie folgt zu erstellen.Übergeben Sie Parameter zu SimpleHTTPRequestHandler

def RequestHandlerClass(application_path):  

    class CustomHandler(SimpleHTTPRequestHandler): 

    def __init__(self, request, client_address, server): 

     SimpleHTTPRequestHandler.__init__(self, request, client_address, server) 
     self._file_1_done = False 
     self._file_2_done = False 
     self._application_path = application_path 

    def _reset_flags(self): 

     self._file_1_done = False 
     self._file_2_done = False 

    def do_GET(self): 

     if (self.path == '/file1.qml'): 
      self._file_1_done = True 

     if (self.path == '/file2.qml'): 
      self._file_2_done = True 

     filepath = self._application_path + '/' + self.path # Error here 

     try: 
      f = open(filepath) 
      self.send_response(200) 
      self.end_headers() 
      self.wfile.write(f.read()) 
      f.close() 
     except IOError as e : 
      self.send_error(404,'File Not Found: %s' % self.path)  


     if (self._file_1_done and self._file_2_done): 
      self._reset_flags() 
      self.server.app_download_complete_event.set() 
    return CustomHandler 

Das ist mein Http den Handler benutzerdefinierte mit

class PythonHtpServer(BaseHTTPServer.HTTPServer, threading.Thread): 

    def __init__(self, port, serve_path): 
    custom_request_handler_class = RequestHandlerClass(serve_path) 
    BaseHTTPServer.HTTPServer.__init__(self, ('0.0.0.0', port), custom_request_handler_class) 
    threading.Thread.__init__(self) 
    self.app_download_complete_event = threading.Event() 

    def run(self): 
    self.serve_forever() 

    def stop(self): 
    self.shutdown()  

und ich starten Sie den Server mit

http_server = PythonHtpServer(port = 8123, serve_path = '/application/main.qml') 

Der Server startet, aber ich bekomme diese Fehlermeldung

AttributeError: CustomHandler instance has no attribute '_application_path' 

Grundsätzlich von dem Fehler, der Server habe begonnen, aber ich weiß nicht, warum es die Attribute nicht erstellt (oder die Init wird nicht aufgerufen). Bitte sag mir, wo ich falsch liege. Jede Hilfe wäre willkommen.

Antwort

0

Konzeptionell, Sie haben geschrieben, etwas wie folgt aus (in diesem Beispiel application_path ~ = var):

def createClass(var): 
    class MyClass: 
     def __init__(self): 
      self.var = var 
     def func(self): 
      # use var in some way 
      print (self.var) 
    # Return class definition 
    return MyClass 

So ist die Klasse geschrieben wird, um die Variable varzu speichern, wenn eine Instanz von MyClass erstellt . Doch durch die Zeit beendet die Funktion, die Variablen zerstört, und da nur die Klasse eine Klasse Definition zurückgibt und keine Klasse Instanz, eine Instanz von MyClass nicht durch die Zeit, die ursprüngliche Variable erstellt erhalten var wird zerstört, und somit wird die Variable var niemals tatsächlich von MyClass gespeichert.

STATT, können Sie var als Argument an die MyClass.__init__ Funktion hinzufügen und einen Generator-Klasse erstellen Erstellung von MyClass Instanzen zu handhaben, etwa so:

class MyClass: 
    def __init__(self, arg1, arg2, var): 
     (self.arg1, self.arg2, self.var) = (arg1, arg2, var) 
    # Insert other methods as usual 

class MyClassGenerator: 
    def __init__(self, var): 
     self.var = var 
    def make(self, arg1, arg2): 
     return MyClass(arg1, arg2, var) 
2

IMHO der einfachste Weg, eine statische Aufladung zu machen _application_path ist Attribut der Klasse. Es wird nur bei Klassendeklaration Zeit erklärt und kann transparent durch Instanzen der Klasse verwendet werden:

def RequestHandlerClass(application_path):  

    class CustomHandler(SimpleHTTPRequestHandler): 

    _application_path = application_path # static attribute 

    def __init__(self, request, client_address, server): 

     SimpleHTTPRequestHandler.__init__(self, request, client_address, server) 
     self._file_1_done = False 
     self._file_2_done = False 

    def _reset_flags(self): 
     ... 

Auf diese Weise jede neue Instanz der benutzerdefinierten Handler-Klasse wird der Zugriff auf den Anwendungspfad als self._application_path hat.

Verwandte Themen