11

questo è il mio server http:BaseHTTPRequestHandler con campione personalizzato

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer 

class test: 
    def show(self): 
     return "aaaa" 

class http_server: 
    def __init__(self, t1): 
     self.t1 = t1 
     server = HTTPServer(('', 8080), myHandler) 
     server.serve_forever() 

class myHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     self.send_response(200) 
     self.send_header('Content-type','text/html') 
     self.end_headers() 
     self.wfile.write(self.t1.show()) #Doesnt work 
     return 

class main: 
    def __init__(self): 
     self.t1 = test() 
     self.server = http_server(self.t1) 

if __name__ == '__main__': 
    m = main() 

ho bisogno di acces esempio t1 all'interno di myHander.

C'è un modo come farlo?

Grazie!

risposta

7
ci

un modo per farlo è quello di impostare la proprietà alla classe:

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer 

class test: 
    def show(self): 
     return "aaaa" 

class http_server: 
    def __init__(self, t1): 
     myHandler.t1 = t1 
     server = HTTPServer(('', 8080), myHandler) 
     server.serve_forever() 

class myHandler(BaseHTTPRequestHandler): 
    t1 = None 
    def do_GET(self): 
     self.send_response(200) 
     self.send_header('Content-type','text/html') 
     self.end_headers() 
     self.wfile.write(self.t1.show()) #Doesnt work 
     return 

class main: 
    def __init__(self): 
     self.t1 = test() 

     self.server = http_server(self.t1) 

if __name__ == '__main__': 
    m = main() 

Bisogna stare attenti che è in ogni dove si utilizza myHandler che è sarà la stessa istanza di t1

+0

Ora questo ha salvato la vita! Molto più semplice (almeno per ora) per istanziare la classe senza sovrascrivere il metodo __init__ e quindi impostare 'handler.t1 = value'. – George

+0

Non avrei mai pensato di utilizzare un membro di classe statico. Invece ho perso più di un'ora cercando come accedere all'istanza che 'HTTPServer' crea internamente (in base alla classe che hai passato su di esso come gestore). Inutile dire che è esploso in un tipico problema di gallina e uovo - il costruttore del gestore ha bisogno dell'istanza del server, che ovviamente non è presente nel momento in cui il gestore viene creato al di fuori della classe del server. XD – rbaleksandar

10

Leggermente versione migliore, dove t1 non sarà lo stesso per ogni istanza.

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer 

class test: 
    def show(self): 
     return "aaaa" 

class http_server: 
    def __init__(self, t1): 
     def handler(*args): 
      myHandler(t1, *args) 
     server = HTTPServer(('', 8080), handler) 
     server.serve_forever() 

class myHandler(BaseHTTPRequestHandler): 
    def __init__(self, t1, *args): 
     self.t1 = t1 
     BaseHTTPRequestHandler.__init__(self, *args) 

    def do_GET(self): 
     self.send_response(200) 
     self.send_header('Content-type','text/html') 
     self.end_headers() 
     self.wfile.write(self.t1.show()) #Doesnt work 
     return 

class main: 
    def __init__(self): 
     self.t1 = test() 

     self.server = http_server(self.t1) 

if __name__ == '__main__': 
    m = main() 
+0

Ciao, non capisco come possa funzionare il gestore, puoi spiegarmi? Quella funzione crea semplicemente un'istanza di myHandler ma poi non restituisce nulla. Grazie – Francesco

+1

@Francesco Per una migliore leggibilità, una dichiarazione di ritorno avrebbe avuto un senso. Tuttavia, come risulta, la classe HTTPServer chiama semplicemente la funzione di gestore e non si preoccupa del suo valore di ritorno. Quindi non restituire nulla funziona ancora. Se si guarda "class BaseServer" (classe base per HTTPServer) - il metodo finish_request chiama semplicemente il RequestHandlerClass passato (passando un riferimento a se stesso) e non si preoccupa delle risposte di questa classe. Quindi il codice sopra funziona :-) – rsmoorthy

+0

Ok, grazie mille – Francesco

4

So che sto rispondendo abbastanza tardi, ma che potrebbe probabilmente essere utile per i futuri spettatori. C'è un modo molto semplice per l'accesso t1 come è stato chiesto utilizzando la variabile server dell'oggetto BaseHTTPRequestHandler:

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer 

class test: 
    def show(self): 
     return "aaaa" 

class http_server: 
    def __init__(self, t1): 
     server = HTTPServer(('', 8080), myHandler) 
     server.t1 = t1 
     server.serve_forever() 

class myHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     self.send_response(200) 
     self.send_header('Content-type','text/html') 
     self.end_headers() 
     self.wfile.write(self.server.t1.show()) 
     return 

class main: 
    def __init__(self): 
     self.t1 = test() 
     self.server = http_server(self.t1) 

if __name__ == '__main__': 
    m = main() 
+0

Buona risposta, ma credo che dovrebbe essere "server.t1 = t1" invece di "self.t1 = t1" nel costruttore http_server. – ketorin

+0

e server.t1 = t1 deve andare dopo l'assegnazione HTTPServer() –

+0

Esatto, grazie ketorin e Aaron_H :) – XaF

Problemi correlati