2014-02-24 1 views
1

장고에서 Long Polling과 관련하여 읽은 적이 있지만 내 문제는 토네이도를 사용하거나 채팅 응용 프로그램을 작성해야하는 복잡한 문제가 아닙니다.Long Polling in Django- DB에 활동이있을 때 응답을 반환하십시오.

JS 클라이언트가 N 초 후에 폴링 요청을 보냈습니다. DB에서 정보를 포함하는 테이블을 업데이트해야합니다. 서버를 요청하고 DB의 특정 테이블에 대한 작업이 있으면 해당 행을 반입하여 클라이언트에 반환해야합니다.

는, 그것이 나에게 경고한다 모델 ABC에서 일어나는 모든 활동이 있다면

class ABC(models.Model): 
    field1 = models.CharField(max_length = 255) 
    field2 = models.CharField(max_length = 255) 
    field3 = models.CharField(max_length = 255) 

을 내 모델 말을하고 정보를 클라이언트로 다시 전송해야 할 수 있습니다.

<script type="text/javascript" charset="utf-8"> 
function addmsg_to_table(msg){ 
    //apending to div 
} 

function waitForMsg(){ 
    /* This requests the url "msgsrv.php" 
    When it complete (or errors)*/ 
    $.ajax({ 
     type: "GET", 
     url: "msgsrv.php", 

     async: true, /* If set to non-async, browser shows page as "Loading.."*/ 
     cache: false, 
     timeout:50000, /* Timeout in ms */ 

     success: function(data){ 
      addmsg_to_table(data); 
      setTimeout(
       waitForMsg, /* Request next message */ 
       1000 /* ..after 1 seconds */ 
      ); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 
      addmsg_to_table(textStatus + " (" + errorThrown + ")"); 
      setTimeout(
       waitForMsg, /* Try again after.. */ 
       15000); /* milliseconds (15seconds) */ 
     } 
    }); 
}; 

$(document).ready(function(){ 
    waitForMsg(); /* Start the inital request */ 
}); 
</script> 

어떻게하면됩니까? 응답을 보내려면 내 views.py를 어떻게 모델링해야합니까? 활동이 테이블에서 발생했는지 여부를 어떻게 알 수 있습니까? 전 완전히 새로운 사람입니다. 감사합니다

답변

0

음, 실시간 프레임 워크로 장고를 사용할 정상적인 방법이 없다는 사실에서 비롯된이 문제를 해결하는 두 가지 방법이 있습니다.

제대로 실시간 알림을 받으려면 Tornado와 같은 실시간 서버를 배포해야합니다. 흐름은 개체가 저장 될 때마다 일부 메시징/대기열 백엔드에 알리도록 작동합니다. 반대편에있는 토네이도는 그러한 이벤트를 듣고 WebSockets (또는 Sock.JS와 같은 추상화 레이어)을 통해 관련 클라이언트에게 배포합니다.

트래픽이 적은 시나리오인데 토네이도 배포에 전혀 문제가 없다면 매번 N 초마다 긴 폴링으로 남습니다. 쿼리 자체는 모델에 추가 할 수있는 last_updated 필드에서 실행될 수 있습니다.

또는 데이터베이스를 완전히 무시하는 정교한 솔루션을 시도해 볼 수 있으며 특정 레코드가 최근에 업데이트 된 경우 캐시를 사용하여 빠른 결과를 반환합니다. 그러나 이것은 실제로 당신의 모델과 사용 패턴에 달려 있습니다.

+0

음, 내 응용 프로그램은 토네이도 또는 웹 소켓을 사용하는 것이 아닙니다. 나를 위해 N 초마다 폴링이 가장 잘 어울립니다. 하지만 내 실제 쿼리는 내 모델에 시간 필드가 없다면 N 초 범위 내에서 테이블에 활동이 발생했는지 어떻게 알 수 있습니까? 내 모델에 '시간'필드를 사용하고 있었다면 범위 내에서 결과 목록을 쉽게 얻을 수 있었지만 시간 필드가 없으므로 테이블에 작업이 발생했는지 여부를 알 수 있습니까? 아니? – PythonEnthusiast

+0

내 대답 편집 –