11

to mój serwer http:BaseHTTPRequestHandler z niestandardowym przykład

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

muszę acces instancji t1 wewnątrz myHander.

Czy jest jakikolwiek sposób to zrobić?

Dzięki!

Odpowiedz

7

istnieje sposób, aby zrobić to ustawić właściwość do klasy:

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

Trzeba być ostrożnym, który jest wszędzie użyć myHandler że będzie taka sama instancja t1

+0

teraz uratował mi życie! Znacznie prostsze (przynajmniej na razie) do utworzenia klasy bez przesłonięcia metody __init__, a następnie ustawienia 'handler.t1 = value'. – George

+0

Nigdy bym nie pomyślał, aby użyć statycznego członka klasy. Zamiast tego zmarnowałem ponad godzinę, szukając dostępu do instancji, którą 'HTTPServer' tworzy wewnętrznie (w oparciu o klasę, którą przekazałeś na nią jako program obsługi). Nie trzeba dodawać, że eksplodowało to w typowy problem z kurczakiem i jajkiem - konstruktor handler'a potrzebuje instancji serwera, która oczywiście nie jest obecna w momencie, gdy przewodnik jest tworzony poza klasą serwera. XD – rbaleksandar

10

Nieznacznie lepsza wersja, gdzie t1 nie będzie takie samo dla każdej instancji.

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

Cześć, nie rozumiem, jak może działać program obsługi, czy możesz mi wyjaśnić? Ta funkcja po prostu tworzy instancję myHandler, ale potem nic nie zwraca. Dziękujemy – Francesco

+1

@Francesco Dla lepszej czytelności, zwrotna informacja miałaby sens. Jak się jednak okazuje, klasa HTTPServer po prostu wywołuje funkcję handler i nie przejmuje się jej wartością zwracaną. Więc żadna rzecz nie powróci. Jeśli spojrzysz na "class BaseServer" (klasa bazowa dla HTTPServer) - metoda finish_request po prostu wywołuje przekazaną klasę RequestHandlerClass (przekazując ref do siebie) i nie przejmuje się odpowiedziami z tej klasy. Tak więc powyższy kod działa :-) – rsmoorthy

+0

Dobrze, dziękuję bardzo – Francesco

4

Wiem, że odpowiadam dość późno, ale to może być pomocne dla przyszłych widzów. Jest to bardzo prosty sposób na dostęp t1 jakby został poproszony przy użyciu zmiennej server obiektu 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

Dobra odpowiedź, ale uważam, że powinno to być "server.t1 = t1" zamiast "self.t1 = t1" w konstruktorze http_server. – ketorin

+0

, a także server.t1 = t1 musi przejść po przypisaniu HTTPServer() –

+0

To prawda, dziękuję ketorin i Aaron_H :) – XaF