Come faccio a modificare le variabili nella istanza del server SocketServer all'interno di un'istanza del gestore RequestHandler in Python?

StackOverflow https://stackoverflow.com/questions/3868132

Domanda

Ecco il codice in questione:

  class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
     __slots__ = ("loaded")

  class Handler(SocketServer.StreamRequestHandler):
     def handle(self):
        print self.server.loaded # Prints "False" at every call, why?
        self.server.loaded = True
        print self.server.loaded # Prints "True" at every call, obvious!

  server = Server(('localhost', port), Handler)
  server.loaded = False

  while True:
     server.handle_request()

Ogni volta che una nuova richiesta arriva, l'output che ottengo è False seguito da True. Quello che voglio è False seguito dal True la prima volta, e True seguito da True d'ora in poi.

Perché non sono le modifiche che ho fatto alla variabile nella istanza del server persistente al di fuori della portata della funzione handle() del conduttore?

AGGIORNAMENTO:

Quindi, cerco di utilizzare le variabili globali per ottenere ciò che voglio:

  loaded = False

  class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
     pass

  class Handler(SocketServer.StreamRequestHandler):
     def handle(self):
        global loaded
        print loaded # Prints "False" at every call still, why?
        loaded = True
        print loaded # Prints "True" at every call, obvious!

  def main():
     server = Server(('localhost', 4444), Handler)
     global loaded
     loaded = False

     while True:
        server.handle_request()

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

E non fa ancora lavoro, cioè produce lo stesso risultato di prima. Qualcuno potrebbe dirmi dove sto andando male?

È stato utile?

Soluzione

Forking crea un nuovo processo, quindi non è possibile modificare le variabili del server nel processo originale. Prova il ThreadingTCPServer invece:

import SocketServer

class Server(SocketServer.ThreadingTCPServer):
    __slots__ = ("loaded")

class Handler(SocketServer.StreamRequestHandler):
    def handle(self):
        self.server.loaded = not self.server.loaded
        print self.server.loaded # Alternates value at each new request now.

server = Server(('localhost',5000),Handler)
server.loaded = False

while True:
    server.handle_request()

Altri suggerimenti

Il tuo problema è che SocketServer.ForkingMixin crea un nuovo processo per ogni richiesta. Pertanto, ogni volta che una nuova richiesta è disponibile in tutte le variabili viene reimpostato al loro stato di default. Quindi, in sostanza, non importa quello che si assegna a self.server.loaded otterrà azzeramento alla successiva richiesta. Questo è anche il motivo per variabili globali non funzionerà.

Se avete bisogno di una variabile a persistere tra le richieste faresti meglio scrivere che i dati in un posto più, ehm, = persistenti). In sostanza, sembra che si sta cercando di risolvere il problema di mantenere le variabili di sessione. Ci sono un milione e uno modi per farlo e a seconda della situazione, in un modo potrebbe essere più pertinente di un altro. Mi raccomando guardando come altre applicazioni SocketServer basati su Python lo fanno.

Basta fare una rapida di Google per il codice simile al vostro:. "Filetype: py SocketServer ForkingMixIn" (uno dei primi risultati è CherryPy che consiglio vivamente guardando)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top