[파이썬] Django를 이용한 실시간 데이터 처리

Django는 파이썬 기반의 웹 프레임워크로, 실시간 데이터 처리에도 매우 효과적으로 사용될 수 있습니다. 이번 블로그에서는 Django를 이용하여 실시간 데이터를 처리하는 방법에 대해 알아보겠습니다.

Django Channels 소개

Django Channels은 Django 애플리케이션에서 WebSocket 연결을 처리하기 위한 라이브러리입니다. 이를 통해 실시간으로 데이터를 전송하고 처리할 수 있습니다.

설치

Channels를 설치하기 위해서는 다음의 명령을 터미널에서 실행합니다:

pip install channels

설정

Channels를 설정하기 위해선 다음과 같은 단계를 따르면 됩니다.

  1. settings.py 파일에 channels를 추가합니다:
INSTALLED_APPS = [
    ...
    'channels',
]
  1. 미들웨어 설정을 변경합니다:

Django 3.0 이상의 버전에서는 다음의 변경이 필요합니다:

MIDDLEWARE = [
    ...
    'channels.middleware.ASgiMiddleware',
    ...
]

Django 3.0 이전의 버전에서는 다음의 변경이 필요합니다:

MIDDLEWARE_CLASSES = [
    ...
    'channels.middleware.ASgiMiddleware',
    ...
]
  1. ASGI 설정을 변경합니다:

settings.py 파일에 다음을 추가합니다:

ASGI_APPLICATION = 'myapp.routing.application'
  1. 채널 라우팅을 설정합니다:

myapp 디렉토리에 routing.py 파일을 생성하고 다음 내용을 추가합니다:

from channels.routing import ProtocolTypeRouter, URLRouter
from django.urls import path
from myapp.consumers import MyConsumer

application = ProtocolTypeRouter({
	'http': get_asgi_application(),
	'websocket': AuthMiddlewareStack(
        URLRouter([
            path('ws/', MyConsumer.as_asgi())
        ])
    ),
})
  1. consumers.py 파일에 컨슈머를 추가합니다:
from channels.generic.websocket import AsyncWebsocketConsumer
import asyncio

class MyConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_name = 'room1'
        self.room_group_name = 'chat_%s' % self.room_name

        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )

        await self.accept()

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )

    async def receive(self, text_data):
        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': text_data
            }
        )

    async def chat_message(self, event):
        message = event['message']

        await self.send(text_data=message)

이제 Django Channels를 사용하여 실시간 데이터 처리를 할 준비가 되었습니다.

사용하기

WebSocket을 사용하여 실시간 데이터 송수신을 하기 위해서는 클라이언트 측에서 WebSocket을 지원하는 JavaScript 라이브러리를 사용해야 합니다. 대표적으로 websocketsocket.io가 있습니다.

클라이언트와 서버 간의 실시간 통신을 위해 다음과 같은 순서로 작업을 수행합니다:

  1. 클라이언트에서 WebSocket을 열어 서버에 연결합니다.
  2. 서버 측에서 WebSocket 연결이 성공하면, 클라이언트를 특정 방에 가입시킵니다.
  3. 클라이언트는 서버에 데이터를 전송할 수 있습니다.
  4. 서버는 전송받은 데이터를 다른 클라이언트들에게 실시간으로 전달합니다.
  5. 클라이언트는 서버로부터 전달받은 데이터를 화면에 표시합니다.

이렇게 실시간 데이터를 처리하는 방법들을 Django Channels를 이용하여 구현할 수 있습니다. Channels는 Django와 잘 호환되며 강력한 기능을 제공합니다. 실시간 데이터 처리를 위해 Django를 사용하는 경우 Channels를 활용해 보는 것을 추천합니다.