2016-08-04 69 views
0

erstens einige Hintergrund.Veraltete Daten von TCP-Socket Worker

Ich versuche, einen einfachen Webserver zu schreiben, der auf flask-appbuilder basiert. Diese Anwendung hat eine Socket TCP-Verbindung geöffnet und sollte eine undefinierte Anzahl von Anforderungen akzeptieren.

Wenn jemand mit der Steckdose verbinden (lassen Sie mit Telnet sagen), wird in der Lage sein, seinen Benutzernamen zu senden, und die Buchse, wird überprüft, ob der Benutzer oder nicht auf der Datenbank aktiv ist und er diesen Wert zurück.

Um loszulegen, fing ich an, in einigen vorhandenen Lösungen zu suchen, und ich fand dieses Simple Network UDP Listen in Flask or Pyramid Welches auf einem UDP-Sockel basiert, aber das Konzept ist ziemlich ähnlich.

Die Anwendung ausgeführt, die Benutzer können eine Verbindung mit dem Socket herstellen, aber wann immer sie ihren Benutzer senden, ist der zurückgegebene Wert nicht das, was die Datenbank festgelegt (aktiviert oder deaktiviert), und ich kann nicht verstehen, warum.

Die Webanwendung reagiert ordnungsgemäß auf die Datenbankänderungen. Aber die SQL-Abfrage aus dem Socket, scheint eine Art alte (veraltete) Daten zurück zu geben, anstatt neue aus der Datenbank zu holen.

Ich füge hier einen Referenzcode hinzu, vielleicht mache ich einen dummen Fehler.

Hier ist, wie ich Sellerie bin Initialisierung:

class FlaskCelery(Celery): 

    def __init__(self, *args, **kwargs): 

     super(FlaskCelery, self).__init__(*args, **kwargs) 
     self.patch_task() 

     if 'app' in kwargs: 
      self.init_app(kwargs['app']) 

    def patch_task(self): 
     TaskBase = self.Task 
     _celery = self 

     class ContextTask(TaskBase): 
      abstract = True 

      def __call__(self, *args, **kwargs): 
       if flask.has_app_context(): 
        return TaskBase.__call__(self, *args, **kwargs) 
       else: 
        with _celery.app.app_context(): 
         return TaskBase.__call__(self, *args, **kwargs) 

     self.Task = ContextTask 

    def init_app(self, app): 
     self.app = app 
     print app.config 
     self.config_from_object(app.config) 

celery = FlaskCelery() 
celery.init_app(app) 

hier ist der Arbeiter-Code:

@celery.task(name='listen_to_tcp', serializer='json', bind=True) 
def listen_to_tcp(self): 

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    sock.bind(('0.0.0.0', app.config['SOCKET_PORT'])) 
    sock.listen(0) 
    while True: 

     connection, client_address = sock.accept() 

     try: 
      while True: 
       data = connection.recv(1024) 
       data = data.strip() 
       if data: 
        qresult = db.session.query(MyUser).filter_by(username=data).one() 
        connection.sendall(qresult.is_active) 
       else: 
        break 
     finally: 
      connection.close() 

listen_to_tcp.delay() 

Dank jemand in der Lage mir wiht dies zu helfen. Prost. L.

Antwort

0

ok es scheint alles nach unten kocht auf mit:

db.session.commit() 

bevor die Abfrage zu tun. Kann jemand dieses Verhalten erklären? Prost. L.