今日の Web 開発において、リアルタイム通信は欠かせない機能の 1 つです。 HTTP プロトコルはリクエストとレスポンスのプロトコルであるため、リアルタイム通信を実現するために従来の HTTP の方法を使用するのは非常に不便です。 WebSocket プロトコルは、Web アプリケーションにリアルタイムの双方向通信機能を提供する新しいプロトコルであり、同じ接続上でデータを送受信できるため、リアルタイム アプリケーションに非常に適しています。 Python サーバー プログラミングでは、django-channels フレームワークを使用して WebSocket を簡単に実装できます。
django-channels を使用し始める前に、まずそれをインストールする必要があります。 pip を使用してインストールできます。
pip install channels
次に、Django プロジェクトを作成します。 Django 2.x 以降では、コマンド ライン ツールを使用してプロジェクトを作成できます。
django-admin startproject myproject
django-channels をインストールした後、 Django プロジェクトに追加する必要があります。 settings.py ファイルを開き、INSTALLED_APPS に「channels」を追加します。さらに、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 が使用されます。
django-channels アプリケーションを作成する前に、受信 WebSocket リクエストをルーティングするためのルートを作成する必要があります。ルートは、URL パスを特定の Consumer クラスにマップするマッピング テーブルです。 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 クラスが使用されます。
django-channels では、Consumer はネットワーク リクエストを処理するクラスです。リクエストはルート内のコンシューマにルーティングされ、コンシューマはリクエストを処理して応答を返します。コンシューマは通常、async def メソッド (つまり、コルーチン) によって実装されます。 Consumer を構築するときは、channels.generic.websocket.WebSocketConsumer クラスを継承し、2 つのメソッドを実装する必要があります。
以下は簡単なコンシューマの例です:
# 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))
これで、すべての設定が完了し、開始できるようになります。 Django サーバーと WebSocket 接続をテストします。ターミナルに次のコマンドを入力して、Django サーバーを起動します:
python manage.py runserver
すべてが正常であれば、http://127.0.0.1:8000/ws/ を通じて WebSocket 接続をテストできるはずです。接続が成功すると、WebSocket Consumer の connect メソッドが実行されます。
概要:
django-channels を使用して WebSocket を実装するのは非常に簡単で、基本的に必要な手順は数ステップだけです。注意すべき点の 1 つは、django-channels アプリケーションでは asyncio コルーチンがよく使用されるため、Python 3.5 以降が必要であるということです。さらに、チャネル層の構成も非常に重要であり、永続ストレージを使用する場合は、RedisChannelLayer などの他のチャネル層を使用できます。
以上がPython サーバー プログラミング: django-channels を使用した WebSocket の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。