ASGI 서버 선택
settings.py에서 ASGI_APPLICATION을 지정
config.asgi.application
과 같이 지정비동기 View / Consumer 구현 방식 결정
AsyncWebsocketConsumer
를 사용하는 것내부 API와의 WebSocket 스트리밍 통신
아래와 같은 예시 코드를 이용해 Django↔프론트, Django↔내부API 모두 웹소켓으로 비동기 연결하여 Django 서버가 메시지 중계
while True
안에서 await ws.recv()
로 내부 API의 슽리밍 데이터를 받고, 곧바로 await self.send(…)
로 프론트에 내보내는 것from channels.generic.websocket import AsyncWebsocketConsumer
import asyncio
import json
import websockets # 비동기 라이브러리
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.accept()
async def receive(self, text_data):
user_data = json.loads(text_data)
query = user_data.get("query")
# 내부 API와 WebSocket 연결
async with websockets.connect("wss://internal-llm.example.com/stream") as ws:
await ws.send(json.dumps({"query":query}))
# 내부 LLM이 토큰 단위, 단계 단위로 메시지 스트리밍
while True:
try:
msg = await asyncio.wait_for(ws.recv(), timeout=10.0)
except asyncio.TimeoutError:
# 타임아웃 처리
break
except websockets.ConnectionClosed:
# 연결 종료
break
# 받은 메시지를 그대로 프론트에 전송
await self.send(msg)
async def disconnect(self, close_code):
pass