[파이썬] web2py에서의 실시간 채팅

실시간 채팅은 웹 애플리케이션에서 사용자들이 실시간으로 채팅할 수 있는 기능을 제공하는 것을 의미합니다. 이 기능은 사용자들이 서로 대화하고 정보를 공유할 수 있게 해주기 때문에 많은 웹 애플리케이션에서 사용되고 있습니다.

web2py는 파이썬으로 작성된 웹 애플리케이션 프레임워크로, 실시간 채팅 기능을 구현하는 데에도 사용될 수 있습니다. web2py는 웹 소켓(WebSocket)을 지원하므로, 이를 활용하여 실시간 채팅을 구현할 수 있습니다.

웹 소켓을 이용한 실시간 채팅 구현

아래는 web2py에서 웹 소켓을 이용하여 실시간 채팅 기능을 구현하는 예제 코드입니다.

# controller.py

def chat():
    return dict()

def websocket_handler():
    if not request.vars.channel:
        return "Channel not specified"
    
    channel = request.vars.channel
    message = request.vars.message
    
    if message:
        # 새로운 메시지를 받았을 때 처리
        messages = db(db.chat.channel == channel).select(orderby=~db.chat.created_at)
        
        if len(messages) >= 10:
            oldest_message = messages[9]
            db(db.chat.id == oldest_message.id).delete()
        
        db.chat.insert(channel=channel, message=message)
    
    return "Success"
<!-- view/chat.html -->

<!DOCTYPE html>
<html>
<head>
    <title>Chat</title>
    
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.1/socket.io.slim.js"></script>
    
    <script>
        $(document).ready(function() {
            var socket = io.connect('http://' + document.domain + ':' + location.port);
            
            socket.on('connect', function() {
                socket.emit('join', {channel: '{{=request.vars.channel}}'});
            });
            
            socket.on('message', function(data) {
                var messageElement = $('<div class="message"/>');
                messageElement.text(data.message);
                $('.chat-room').append(messageElement);
            });
            
            $('form').submit(function(event) {
                event.preventDefault();
                var message = $('#messageInput').val();
                socket.emit('send_message', {channel: '{{=request.vars.channel}}', message: message});
                $('#messageInput').val('');
            });
        });
    </script>
</head>
<body>
    <div class="chat-room"></div>
    
    <form>
        <input type="text" id="messageInput" placeholder="Type your message" />
        <button type="submit">Send</button>
    </form>
</body>
</html>

위 예제 코드는 웹 소켓 통신을 위해 socket.io 라이브러리를 사용합니다. Chat 컨트롤러의 chat() 액션은 chat.html 뷰와 연결되어 채팅 화면을 보여주고, websocket_handler() 액션은 웹 소켓 메시지를 처리합니다.

뷰 파일에서는 socket.io 클라이언트를 초기화하고, 연결된 웹 소켓 서버에 메시지를 보내고 받는 이벤트를 정의합니다. join 이벤트로 채널에 가입하고, send_message 이벤트로 메시지를 전송합니다. 받은 메시지는 <div class="message"> 요소로 만들어 채팅방에 추가됩니다.

controller 파일에서는 메시지를 받으면 데이터베이스에 저장하는 코드가 구현되어 있습니다. 이 예제에서는 최대 10개의 메시지만 유지하도록 설정되어 있습니다. 새로운 메시지가 추가되면, 가장 오래된 메시지를 삭제합니다.

결론

web2py를 사용하여 실시간 채팅 기능을 구현하는 방법을 살펴보았습니다. 웹 소켓을 이용하여 실시간으로 메시지를 주고받을 수 있고, 데이터베이스를 통해 메시지를 저장하고 관리할 수 있습니다. 이를 기반으로 웹 애플리케이션에 실시간 채팅 기능을 추가할 수 있습니다.