2013-05-25 5 views
4

추가 개선을 위해 서버 푸시 (또는 혜성)가 필요한 장고 응용 프로그램을 개발했습니다. IE를 제외한 모든 주요 브라우저에서 훌륭하게 작동하는 "궤도를 따라"사용하여 서버 푸시를 성공적으로 구현했습니다 (예 IE ...이 IE는 내 인생을 다시 망치고 있습니다). IE의 중요성은 크게 줄어들지 만 모든 주요 플랫폼에서 작동 할 서버 밀어 넣기를 구현하는 것이 좋습니다.Django 서버 푸시 방법

나는 수일 동안 인터넷 검색을 해왔으며 여기 내가 찾은 몇 가지 옵션이 있습니다.

    장고 + 토네이도 프레임 워크 그것은 장고 + 토네이도 플랫폼은 장기적으로 더 적합 사용하는 것 같아

를 사용

  • 사용 evserver (https://code.google.com/p/evserver/)
  • ,하지만 난 정말를 찾을 수 없습니다 좋은 예제에서 두 프레임 워크를 결합하여 서버 푸시를 구현하는 방법을 배울 수 있습니다. 이 프로젝트는 심지어 서버 푸시 메커니즘을 처리하거나, 약간의 설명이 부족한 경우 내가 찾은 유일한 예는

    장고 - 토네이도 - 데모 (https://github.com/bdarnell/django-tornado-demo/tree/master/testsite)

    는 그러나, 나는 확실하지 않다이었다.

    아무도 나를 장고와 토네이도를 결합하여 실제로 서버 푸시 메커니즘을 구현하는 데모 프로젝트의 좋은 예를 안내 해줄 수 있습니까? 또한이 주제에 관한 모든 정보는 높이 평가 될 것입니다.

    대단히 감사합니다. https://github.com/mrjoes/sockjs-tornado

    첫째, 환경이 준비합니다 :

    pip install sockjs-tornado 
    

    둘째, 설정 토네이도에 있습니다

    application = django.core.handlers.wsgi.WSGIHandler() 
    container = tornado.wsgi.WSGIContainer(application) 
    
    
    tornado_app = tornado.web.Application(
        EchoSockjsRouter('/websocket')+ 
        [ 
         ('/source/([^/]+)', SourceHandler), 
         ('.*', tornado.web.FallbackHandler, dict(fallback=container)), 
        ] 
    ) 
    
    HTTPServer(tornado_app).listen(port) 
    tornado.ioloop.IOLoop.instance().start() 
    

    '/ 소스'는

  • 답변

    6

    SockJS 길을 가야하는 것입니다 요청 처리기 (@ gen.engine과 비동기로 사용), '. *'는 장고에서 작동하며 EchoSockjsRouter는 원하는 것입니다.

    from sockjs.tornado import SockJSRouter, SockJSConnection 
    
    class EchoWebSocket(SockJSConnection): 
        def on_open(self, request): 
         print "sockjs: open" 
    
        def on_message(self, data): 
         print "data: %r" % (data,) 
         self.send(data) 
    
        def on_comment(self, data): 
         print "data: %r" % (data,) 
         self.send(data) 
    
        def on_close(self): 
         print "sockjs: close" 
    
    def EchoSockjsRouter(prefix): 
        return SockJSRouter(EchoWebSocket, prefix).urls 
    

    그 후, 당신은 UI (나는 SockJS 클라이언트 버전 0.3.4, http://sockjs.org, MIT 라이센스 사용하고 있습니다) 설치해야합니다

    <script src="<SockJS Javascript>"></script> 
    <script> 
        socket = new SockJS('http://localhost:8000/websocket'); 
        socket.onmessage = function(e) { 
         console.log(e.data); 
        }; 
        socket.onclose = function() { 
         console.log('closed :('); 
        }; 
        socket.onopen = function() { 
         console.log('opened :>'); 
         letTheMadnessBegin(); 
        }; 
    
        function letTheMadnessBegin() { 
         // silly, but you get the idea 
         socket.send(JSON.stringify({ 
          name: $('#name').text(), 
          message: $('input').val() 
         })); 
        } 
    <script> 
    

    글쎄, 당신은 $ 내부 꽤 스크립트를 만들 수 있습니다 (function() {}) ... 그러나 그 외에는 준비가 끝났습니다 : http://grab.by/mSv6, http://grab.by/mSuU (404 죄송합니다, 사실적으로 만드는 것입니다). 내가 Socketio과 노력, 토네이도 웹 소켓 어떤 다른 사람을 유의하시기 바랍니다 https://idea.popcount.org/2012-09-21-django-with-sockjs/

    : 나는에서이 패턴을했다. 그러나 SocketJS는 매우 간단했습니다.

    감사합니다.

    +0

    대단히 감사합니다. Ericson. 당신의 대답과 모든 참고 문헌들은 제가 올바른 방향으로 나아갈 수 있도록 도와주었습니다. 나는 아직 내 응용 프로그램과 함께 이것을 실제로 구현할 기회가 없었지만 지금은 무엇을해야하는지 더 명확하게 생각하고 있습니다. 다시 감사합니다. –

    +0

    마침내 Django 애플리케이션으로 SockJS를 구현했고 앞으로 서버 푸시에 대한 도움을 얻기 위해이 페이지를 방문 할 수있는 사람을 위해 후속 조치를 원합니다. SockJS는 매우 간단하고 쉽게 구현할 수 있으며 테스트 한 모든 주요 브라우저에서 매력적으로 작동합니다. Ericson이 지적했듯이, SockJS는 갈 길이 멀다. –

    +0

    이 예제에서 서버가 모든 클라이언트에 대한 메시지를 시작하는 곳을 찾고 있습니다 (즉, 서버 푸시를 시작합니다). 어딘가 여기 있니? 클라이언트의 메시지가 다른 연결된 클라이언트에게 재방송되지만 서버가 시작하는 메시지는 다시 볼 수 없습니다. – npskirk