2017-12-26 6 views
0

mongoDB에서 가져온 웹 페이지를 작성하고 반환 된 값을 기반으로 테이블을 업데이트합니다. 현재 나는 모터를 사용하여 mongoDB에 질의를하고 각 메시지를 비동기 적으로 처리 할 수있다. 그러나 나는 페이지의 부하 당 한 번만 쓸 수 있습니다. 페이지가 열려있는 한 계속해서 토네이도를 mongoDB에서 끌어 올 수있는 방법이 있는지 궁금합니다. 이것은 내가 현재 페이지로드 당 작업하고 있지만 mongoDB가 업데이트 될 때이를 기반으로 동적으로 업데이트하는 방법을 알지 못합니다.비동기 mongoDB 쿼리를 기반으로 테이블을 지속적으로 업데이트합니다.

import tornado.ioloop, tornado.web, motor 

class LoadHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     db = self.settings['db'] 
     self.write(''' 
     <<!doctype html> 
     <html lang="en"> 
      <head> 
       <title>Coin Info</title> 
       <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
       <script type=text/javascript src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
       <style> 
        div.table {border: 1px solid black; display: table; width: 500px;} 
        div.row {border: 1px solid black; display: table-row; } 
        div.cell {border: 1px solid black; display: table-cell; } 
        div.wrapper { float: left;width: 200px; } 
       </style> 
      </head> 
      <body> 
       <div class="wrapper"> 
        <div class="table"> 
         <div class="header"> 
          <div class="cell">Name</div> 
          <div class="cell">Item1</div> 
          <div class="cell">Item2</div> 
          <div class="cell">Item3</div> 
         </div> 
     ''') 
       db.posts.find().sort([('_id',-1)]).each(self._got_message) 

    def _got_message(self, message,error): 
     if error: 
      raise tornado.web.HTTPError(500, error) 
     elif message: 
      self.write('<div class="row">') 
      self.write('<div class="cell" data-name={0}>{0}</div>'.format(message['values']['name'])) 
      self.write('<div class="cell" data-item1={0}>{0}</div>'.format(message['item1'])) 
      self.write('<div class="cell" data-item2={0}>{0}</div>'.format(message['values']['item2'])) 
      self.write('<div class="cell" data-item3={0}>{0}</div>'.format(message['values']['item3'])) 
      self.write('</div>') 
     else: 
      self.write('</div></div></div></div></body>') 
      self.finish() 

class MainHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     self.write('here') 
     self.finish() 

db = motor.MotorClient().current_db 

application = tornado.web.Application([ 
     (r'/load/', LoadHandler), 
     (r'/', MainHandler) 
    ], db=db 
) 

print('Listening on http://localhost:5000') 
application.listen(5000) 
tornado.ioloop.IOLoop.instance().start() 

답변

1

정상적인 HTTP 연결은 서버가 응답 전송을 마치 자마자 닫힙니다. 따라서 연결이 닫히면 클라이언트에 데이터를 보낼 수 없습니다.

클라이언트에 실시간 데이터 업데이트를 보내려면 웹 소켓을 사용할 수 있습니다. 일반 HTTP 연결과 달리 Websocket 연결은 원하는만큼 열려 있으며 서버는 필요할 때마다 클라이언트에 데이터를 자유롭게 보낼 수 있습니다.

토네이도의 documentation은 Websocket을 시작하는 것이 좋습니다. 일부 고급 기능의 경우 demo 채팅 앱이있어 자유롭게 놀 수 있습니다.

관련 문제