2016-08-04 51 views
0

首先關閉一些背景。來自TCP Socket工作人員的陳舊數據

我想寫一個簡單的web服務器,基於flask-appbuilder。 此應用程序將打開Socket TCP連接,並且應該接受未定義數量的請求。

當某人連接到套接字(比如說使用telnet)時,將能夠發送他的用戶名和套接字,將檢查用戶是否在數據庫中處於活動狀態並將其返回此值。

爲了啓動它我開始尋找一些現有的解決方案,我發現這一個Simple Network UDP Listen in Flask or Pyramid 這是基於UDP套接字,但概念是非常相似。

應用程序運行時,用戶可以連接到套接字,但是每當他們發送用戶時,返回的值不是數據庫設置(啓用或禁用)的值,我無法理解原因。

Web應用程序ui正在對數據庫更改作出正確反應。 但是,使用套接字的sql查詢似乎正在返回某種舊(過時)數據,而不是從數據庫中獲取新數據。

我會在這裏添加一些參考代碼,也許我在做一些愚蠢的錯誤。

這裏是我如何初始化芹菜:

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) 

這裏是工人代碼:

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

由於任何人能幫助我這個室內用。 乾杯。 L.

回答

0

OK似乎這一切都歸結於具有:

db.session.commit() 

做查詢之前。 有沒有人能夠解釋這種行爲? 乾杯。 L.