Django中WebSocket长连接

一、首先安装必要依赖:

pip install channels channels-redis

二、核心代码实现

1.ASGI配置启用WebSocket协议并设置认证中间件

import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.urls import re_path
from .consumers import NotificationConsumer

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter([
            re_path(r'ws/notifications/$', NotificationConsumer.as_asgi()),
        ])
    ),
})
asgi.py

2.消费者实现基础消息收发和连接确认功能

import json
from channels.generic.websocket import AsyncWebsocketConsumer

class NotificationConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.send(text_data=json.dumps({
            'type': 'connection_established',
            'message': 'WebSocket连接成功'
        }))

    async def disconnect(self, close_code):
        pass

    async def receive(self, text_data):
        data = json.loads(text_data)
        await self.send(text_data=json.dumps({
            'type': 'echo_response',
            'message': f'收到消息: {data["message"]}'
        }))
consumers.py

3、关键配置检查

INSTALLED_APPS = [
    ...,
    'channels',
]

ASGI_APPLICATION = 'your_project.asgi.application'
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels.layers.InMemoryChannelLayer"
    }
}
settings.py

4、启动命令

daphne your_project.asgi --port 8000

若报错,可尝试以下备选方案:

使用Uvicorn替代Daphne:uvicorn application.asgi:application --ws websockets

5、校验 Uvicorn WebSocket 连接

  • ‌设置服务器 URL‌:在 "Server URL" 字段中输入 ws://127.0.0.1:8000/ws/notifications/

     

 

posted @ 2025-06-24 09:56  三三得九86  阅读(17)  评论(0)    收藏  举报