>  기사  >  백엔드 개발  >  Python 서버 프로그래밍: django-channels를 사용하여 WebSocket 구현

Python 서버 프로그래밍: django-channels를 사용하여 WebSocket 구현

王林
王林원래의
2023-06-18 10:43:161679검색

오늘날의 웹 개발에서 실시간 커뮤니케이션은 빼놓을 수 없는 기능 중 하나입니다. HTTP 프로토콜은 요청-응답 프로토콜이므로 실시간 통신을 달성하기 위해 전통적인 HTTP 방법을 사용하는 것은 매우 불편합니다. WebSockets 프로토콜은 웹 애플리케이션에 실시간 양방향 통신 기능을 제공하고 동일한 연결에서 데이터를 보내고 받을 수 있는 새로운 프로토콜로, 실시간 애플리케이션에 매우 적합합니다. Python 서버 프로그래밍에서 WebSocket은 django-channels 프레임워크를 사용하여 쉽게 구현할 수 있습니다.

  1. Django-channels 설치

django-channels를 사용하기 전에 먼저 django-channels를 설치해야 합니다. pip를 사용하여 설치할 수 있습니다.

pip install channels
  1. Django 프로젝트 만들기

다음으로 Django 프로젝트를 만듭니다. Django 2.x 이상에서는 명령줄 도구를 사용하여 프로젝트를 생성할 수 있습니다:

django-admin startproject myproject
  1. Configure django-channels

django-channels를 설치한 후 Django 프로젝트에 추가해야 합니다. settings.py 파일을 열고 INSTALLED_APPS에 '채널'을 추가하세요. 또한 django-channels에 대해 일부 설정을 구성해야 합니다.

# settings.py

# 添加channels到INSTALLED_APPS
INSTALLED_APPS = [
    # ...
    'channels',
]

# 配置channels
ASGI_APPLICATION = 'myproject.routing.application'
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels.layers.InMemoryChannelLayer',
    },
}

위 코드에서 ASGI_APPLICATION은 ASGI 애플리케이션의 진입점을 지정하고 CHANNEL_LAYERS는 기본 채널 계층의 유형과 매개변수를 지정합니다. 이번 예시에서는 간단한 메모리 저장을 구현하는 채널 레이어인 InMemoryChannelLayer를 사용했습니다.

  1. 경로 만들기

django-channels 애플리케이션을 만들기 전에 들어오는 WebSocket 요청을 라우팅하기 위한 경로를 만들어야 합니다. 경로는 URL 경로를 특정 소비자 클래스에 매핑하는 매핑 테이블입니다. Django에서는 일반적으로 urls.py 파일에 경로가 정의되어 있지만 django-channels에서는 ASGI 프로토콜을 사용하므로 다음과 같이 Routing.py에 경로가 정의됩니다.

# myproject/routing.py

from channels.routing import ProtocolTypeRouter, URLRouter
from django.urls import path

application = ProtocolTypeRouter({
    # WebSocket使用的协议类型是“websocket”,将它放在第一位
    "websocket": URLRouter([
        path("ws/", MyConsumer.as_asgi()),
    ]),
})

위 코드에서는 ProtocolTypeRouter 생성을 사용합니다. 프로토콜 경로를 지정하고 WebSocket 기반 하위 경로를 설정합니다. 이 예에서 WebSocket이 요청한 URL은 /ws/이며 연결 시 MyConsumer 클래스가 사용됩니다.

  1. Create Consumer

django 채널에서 Consumer는 네트워크 요청을 처리하는 클래스입니다. 요청은 경로를 통해 소비자에게 라우팅될 수 있으며, 그러면 소비자는 요청을 처리하고 응답을 반환합니다. 소비자는 일반적으로 async def 메서드(예: 코루틴)로 구현됩니다. Consumer를 빌드할 때,channels.generic.websocket.WebSocketConsumer 클래스를 상속하고 두 가지 메소드를 구현해야 합니다:

  • connect(self): django-channels는 WebSocket 연결이 설정될 때 이 메소드를 호출합니다.
  • receive(self, text_data=None, bytes_data=None): 이 메서드는 WebSocket 연결에서 데이터가 수신될 때 django-channels에 의해 호출됩니다.

다음은 간단한 Consumer 예제입니다:

# myapp/consumers.py

import asyncio
import json

from channels.generic.websocket import AsyncWebsocketConsumer


class MyConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        """
        WebSocket连接建立时执行。
        """
        await self.accept()

    async def disconnect(self, code):
        """
        WebSocket连接中断时执行。
        """
        pass

    async def receive(self, text_data=None, bytes_data=None):
        """
        当从WebSocket连接接收到数据时执行。
        """
        # 解析WebSocket发送的JSON数据
        data = json.loads(text_data)
        # 从JSON数据中获取请求
        request = data['request']

        # 这里是处理请求的代码
        # ...

        # 发送响应到WebSocket连接
        response = {'status': 'OK', 'data': request}
        await self.send(json.dumps(response))
  1. Start the Django server

이제 모든 설정이 완료되었으므로 Django 서버를 시작하고 WebSocket 연결을 테스트할 수 있습니다. Django 서버를 시작하려면 터미널에 다음 명령을 입력하세요.

python manage.py runserver

모든 것이 정상이라면 http://127.0.0.1:8000/ws/를 통해 WebSocket 연결을 테스트할 수 있어야 합니다. WebSocket 소비자의 연결 메소드가 실행됩니다.

요약:

django-channel을 사용하여 WebSocket을 구현하는 것은 매우 간단하며 기본적으로 몇 단계만 거치면 됩니다. 한 가지 주목할 점은 django-channels 애플리케이션에서는 asyncio 코루틴이 자주 사용되므로 Python 3.5 이상이 필요하다는 것입니다. 또한, 채널 계층의 구성도 매우 중요합니다. 영구 저장소를 사용하려면 RedisChannelLayer와 같은 다른 채널 계층을 사용할 수 있습니다.

위 내용은 Python 서버 프로그래밍: django-channels를 사용하여 WebSocket 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.