2011-04-10 4 views
30

Python에서 Comet에 대한 모든 선택 사항과 구성을 이해하는 것이 불가능하다는 것을 알고 있습니다. 내가 찾은 모든 블로그 게시물뿐만 아니라 여기에서 모든 대답을 읽었습니다. 이 시점에서 내가 출혈하려고하는 것 같아서,이 질문에 잘못된 점에 대해 사과드립니다.Python에서 혜성을 이해하는 데 도움이 필요합니다. (장고 함께)

나는이 모든 것에 완전히 새롭다. 이전에 아파치에서 PHP/Django 백엔드가있는 간단한 비 실시간 사이트였다.

내 목표는 실시간 채팅 응용 프로그램을 만드는 것입니다. 사용자, 인증, 템플릿 등을 위해 Django와 연결되기를 바랍니다. 다른 도구 도구가 필요하다는 말을 읽을 때마다 끝이없는 체인처럼 느껴집니다.

우선이 작업에 필요한 모든 도구를 카테고리로 분류 할 수 있습니까?
저는 클라이언트 측에서 다른 서버, 네트워킹 라이브러리, 엔진, JavaScript에 대해 읽었으며 그 밖의 다른 것을 알지 못합니다. 나는 그것이이 복합체 일 것이라고 결코 상상조차하지 않았다.

/트위스티드 웹이 인기가있는 것 같지만, 그것을 통합 할 생각이 없거나 내가 필요로하는 것 (적어도 클라이언트 측 JS가 필요하다고 추측 함)이 필요합니다.

정확하게 이해하면 Orbited에 작성되어에 꼬인 왜곡 된 부분이 있습니까?

Gevent와 Eventlet은 Twisted와 같은 범주입니까? 내가 그걸로 얼마나 더 필요합니까?

Redis와 같은 셀러리, RabbitMQ 또는 KV 매장은 어디로 들어 옵니까? 메시지 큐 개념을 이해하지 못합니다. 필수적이며 어떤 서비스를 제공합니까?

내가보아야 할 완전한 채팅 앱 자습서가 있습니까?

나는이 정신 장애물을 넘어서 나를 도와주는 사람에게 전적으로 빚을지게 될 것이며, 무엇이든지 남겨두면 주저하지 말고 물어보십시오. 나는 그것이 꽤로드 된 질문이라는 것을 압니다.

+0

이 사진을 보셨습니까? 그 일에 필요한 모든 근원을 가지고있는 것 같습니다. http://www.rkblog.rk.edu.pl/w/p/django-and-comet/ – jbcurtin

+0

@jbcurtin 고마워, 아마도 내가 읽은 최고의 기사 일 것이다. 궤도가 잘 정비되어 있지 않은 것 같습니다. 비슷한 프로젝트가 많이 있습니까? 나는 (특히 모든 메시지가 데이터베이스에 영구히 남아 있기를 원하기 때문에) 다른 것을 사용해야하는지 여전히 알지 못한다. 나는 여전히 Twisted에 대해 모두 알아야 하나? – XOR

+0

나는이 일을 완수하기 위해 장고를 고용하는 것이별로 행운이 없다고 생각한다. 내가 찾을 수있는 옷장은'장고 evserver'였습니다.뒤틀림은 갈 길이 멀지 만, 결국 혜성은 단지 그것을 열어두기 위해 실을 매달아 놓을뿐입니다. 이 작업을 수행하려면 전체 장고 수명주기를 종료해야합니다. – jbcurtin

답변

8

Socket.IO를 사용할 수 있습니다. 그것을위한 도대체 및 토네이도 핸들러가 있습니다. 장고 함께 gevent-socketio 내 블로그 게시물을 참조하십시오 : http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/

+0

게시물을 보면 정말 쉽습니다. 감사합니다! 따라하기 위해 노력했지만 설치하는 데 문제가 있습니다. 그것을 시도해 볼 때 (만약에!) 나는 그것을 밖으로 시도한다. – XOR

5

나는 지난 몇 개월 동안 같은 연구를 통해 가야했다. 아직 적절한 문서를 처리 할 시간이 없었지만 및 tornadiohttp://bitbucket.org/virtualcommons/vcweb으로 장고를 사용하는 예가 있습니다. 장고 서버 측에서 대기열을 사용하는 tornadio 서버 프로세스로의 직접 통신을 설정하려고합니다. 즉, 장고보기의 논리는 대기열에 메시지를 푸시합니다.이 메시지는 tornadio가 처리하여 json으로 인코딩 된 버전의 메시지를 관심있는 모든 구독자에게 보냅니다.) 그러나 아직 그 부분을 완전히 구현하지 않았습니다. 나는 현재이 설정 왔 방법은 포함한다 :

  1. external tornado (tornadio) server, 다른 포트에서 실행 socket.io 요청을 승인하고 장고 모델 작업. 이 서버 프로세스가 데이터베이스에 저장하는 유일한 메시지는 저장해야하는 채팅 메시지입니다. 모든 Django 모델에 대한 완전한 액세스 권한을 가지며 모든 실시간 상호 작용은이 서버 프로세스를 통해 직접 이동해야합니다.실시간 액세스를 필요로
  2. 장고 템플릿 페이지 + 내가 orbited, hookboxgevent로 보였지만 socket.io로 가기로 결정

tornadio 서버에 직접 연결을 설정 자바 스크립트와 socket.io 포함 그것이 나에게 가장 깨끗한 javascript + python 코드를 허용하는 것처럼 보였던 것에 따라 토네이도. 지난 해 Python/Django를 배우기 시작한 것은 잘못되었습니다.

+0

위대한 답변, 감사합니다. Tornadio와 코드를 확인합니다. 나는 또한 모든 제안에 열려있어 파이썬/장고에 새로운 있습니다! – XOR

3

Redis는 고유 한 publish/subscribe을 지원하는 지속성 계층과 관련이 있습니다. 따라서 db를 폴링하여 새 메시지를 찾는 상황 대신 채널을 구독하고 메시지를 사용자에게 푸시 할 수 있습니다.

귀하가 설명하는 시스템 유형의 working example가 있습니다. 마법은 socketio view에서 일어나는 :

  1. 이 socket.io를 설정 등록하는 레디 스 클라이언트와 현재 사용자
  2. 사용 Gevent를 얻을 :

    def socketio(request): 
        """The socket.io view.""" 
        io = request.environ['socketio'] 
        redis_sub = redis_client().pubsub() 
        user = username(request.user) 
    
        # Subscribe to incoming pubsub messages from redis. 
        def subscriber(io): 
         redis_sub.subscribe(room_channel()) 
         redis_client().publish(room_channel(), user + ' connected.') 
         while io.connected(): 
          for message in redis_sub.listen(): 
           if message['type'] == 'message': 
            io.send(message['data']) 
        greenlet = Greenlet.spawn(subscriber, io) 
    
        # Listen to incoming messages from client. 
        while io.connected(): 
         message = io.recv() 
         if message: 
          redis_client().publish(room_channel(), user + ': ' + message[0]) 
    
        # Disconnected. Publish disconnect message and kill subscriber greenlet. 
        redis_client().publish(room_channel(), user + ' disconnected') 
        greenlet.throw(Greenlet.GreenletExit) 
    
        return HttpResponse() 
    

    단계별로 뷰를 타고 "가입자"- 이것은 Redis에서 들어오는 메시지를 받아서 클라이언트 브라우저로 전달합니다.

  3. 은 socket.io에서 (사용자의 브라우저에서) 메시지를 받아 소켓이

레디 스 요리 책은 레디 스 측에 little more detail을 제공 끊어 때까지 레디 스에

  • 반복을 미는 "게시자"실행 뿐만 아니라 메시지를 지속 할 수있는 방법을 논의합니다.

    나머지 질문에 대해 : Twisted는 이벤트 기반 네트워킹 라이브러리입니다.이 응용 프로그램에서는 Gevent의 대안으로 간주 될 수 있습니다. 내 경험으로는 디버깅하기가 강력하고 어렵습니다.

    셀러리는 "분산 된 작업 대기열"입니다. 기본적으로 여러 대의 컴퓨터에 작업 단위를 분산시킬 수 있습니다. "분산 된"각도는 기계 사이에 어떤 종류의 수송이 필요하다는 것을 의미합니다. 샐러리는 RabbitMQ (및 Redis도 포함하여)의 여러 유형의 운송을 지원합니다.

    예제의 맥락에서 Celery는 욕설 같은 내용을 검색하는 등 각 메시지에 대해 비용이 많이 드는 처리를해야하는 경우에만 적합합니다. 여전히 셀러리 태스크를 초기화해야하는 경우도 있으므로 socket.io 콜백을 수신하는 코드가 필요합니다.

    은 (당신이 완전히 혼동하지 않았다 그냥 경우, 셀러리 자체는 기본 동시성 라이브러리로 Gevent를 사용하도록 만들 수 있습니다.) 도움이

    희망!

  • 관련 문제