python - websocket

文章目录


前言

在 Django 中实现 WebSocket 功能通常使用的是第三方库 channels,它使得在 Django 中处理 WebSocket 变得简单且高效。下面我将为你提供一个基本的讲解和示例,演示如何在 Django 中使用 channels 实现 WebSocket 功能


一、安装和配置 channels

1. 框架安装

之前我写过django框架的安装,具体可以参考https://blog.csdn.net/weixin_42695345/article/details/141932497,这里就不演示安装django了,还是之前那个backend/fa项目

2. 安装和配置 channels

安装channels库:

python 复制代码
# 安装
pip install channels
# 查看列表(在列表看到channels即可,我的版本为channels 4.1.0)
pip list

settings.py 中配置 channels:

python 复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'backend', # add app to INSTALLED_APPS
    'fa',
    'channels', # add channels to INSTALLED_APPS
]

二、创建 WebSocket 路由和处理器

在 Django 中,WebSocket 的处理是通过 ASGI(Asynchronous Server Gateway Interface)来实现的。你需要定义一个路由和一个处理器来处理 WebSocket 连接

1.创建路由(routing)

在fa(自己的应用目录)目录下创建一个routing.py

python 复制代码
from channels.routing import ProtocolTypeRouter, URLRouter # 导入路由器
from channels.auth import AuthMiddlewareStack # 导入认证中间件
from django.urls import path # 导入路径
from fa.consumers import WebsocketConsumer # 导入websocket消费者,这个WebsocketConsumer是在fa/consumers.py中定义的
from . import consumers # 导入consumers模块

# 定义websocket路由
websocket_urlpatterns = [
    path('ws/chat/', consumers.WebsocketConsumer.as_asgi()),
]

# 定义application
application = ProtocolTypeRouter({
    'websocket' : AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ) 
})

2.创建 WebSocket Consumer

还是相同目录创建一个名为consumers.py的文件

python 复制代码
from channels.generic.websocket import AsyncWebsocketConsumer
import json

# 定义一个WebsocketConsumer
class WebsocketConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        # 这里是连接成功的回调函数,可以用来处理一些初始化的操作
        await self.accept()

    async def disconnect(self, close_code):
        # 这里是断开连接的回调函数,可以用来处理一些清理的操作
        pass

    async def receive(self, text_data):
        # 这里是接收到消息的回调函数,可以用来处理接收到的消息,像用户认证,数据核验,状态更新等等
        # 这里假设接收到的消息是json格式的
        # text_data_json = json.loads(text_data)
        # message = text_data_json['message']

        # 这里是向客户端发送消息的函数
        await self.send(text_data=json.dumps({
            'message': text_data
        }))

3.前端集成

在项目或者本地创建一个html,我这边是在本地的,如果需要在项目里面创建一个前端页面访问websocket可以参考https://blog.csdn.net/weixin_42695345/article/details/142101921创建

html 复制代码
<DOCTYPE html>
<html>
<head>
	<title>WebSocket Example</title>
	<script type="text/javascript">
        var socket = new WebSocket('ws://127.0.0.1:8001/ws/chat/');

        socket.onopen = function() {
            console.log('WebSocket连接已打开.');
        };

        socket.onmessage = function(event) {
            console.log('接收到消息:', event.data);
        };

        socket.onerror = function(error) {
            console.error('WebSocket错误:', error);
        };

        socket.onclose = function(event) {
            console.log('WebSocket连接已关闭.');
        };

        function sendMessage(message) {
            socket.send(message);
        }
    </script>
</head>
<body>
	<h1>WebSocket Example</h1>
	<input type="text" id="messageInput" />
	<button onclick="sendMessage(document.getElementById('messageInput').value)">Send</button>
</body>
</html>

三.启动和运行

启动 Django 项目并运行 WebSocket 服务,使用以下命令运行 Django 项目:

  1. 首先执行python manage.py runserver 0.0.0.0:8000运行django项目
  2. 执行daphne -p 8001 backend.asgi:application运行websocket
  3. 最后访问websocket那个html并试一下效果

    这样就可以在 Django 中实现简单的 WebSocket 功能了。通过 channels,你可以扩展 WebSocket 功能,例如添加认证、权限控制、处理复杂的消息传输等

四.尝试过程中遇到的错误及解决方案

  1. 在执行daphne -p 8001 backend.asgi:application可能会报错类似这种,这是因为没有安装daphne,通过执行命令pip install daphne可解决
  2. 然后我又遇到了一个报错,如下:
python 复制代码
Traceback (most recent call last):
  File "D:\flask\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "D:\flask\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "D:\test\.venv\Scripts\daphne.exe\__main__.py", line 7, in <module>
  File "d:\test\.venv\lib\site-packages\daphne\cli.py", line 171, in entrypoint
    cls().run(sys.argv[1:])
  File "d:\test\.venv\lib\site-packages\daphne\cli.py", line 233, in run
    application = import_by_path(args.application)
  File "d:\test\.venv\lib\site-packages\daphne\utils.py", line 17, in import_by_path
  File "D:\flask\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
    import pymysql
ModuleNotFoundError: No module named 'pymysql'

通过执行命令pip install pymysql即可解决

然后再启动websocket

五.注意事项

  1. 确保 django-channels 版本和 Django 版本兼容,确保 Django 项目正在运行
  2. 确认 WebSocket 服务器正在运行:如果你使用了 Django Channels,并且使用了 daphne 或其他 ASGI 服务器来运行 WebSocket,确保该服务器在指定的端口上运行。例如,如果在终端中运行了daphne -p 8001 backend.asgi:application,则 WebSocket 服务器应该监听在 ws://127.0.0.1:8001/ws/chat/
  3. 检查浏览器控制台错误信息:在浏览器中打开你的 WebSocket 页面,并在浏览器的开发者工具中查看控制台信息。如果 WebSocket 连接失败,通常会有错误消息显示
  4. 确保前端页面中的 JavaScript 代码正确
  5. 确保你的计算机可以访问 WebSocket 服务器的地址和端口,有时候防火墙或网络设置可能会阻止 WebSocket 连接
相关推荐
小oo呆19 分钟前
【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核
python·jupyter·conda
小白学大数据1 小时前
Scrapy框架下地图爬虫的进度监控与优化策略
开发语言·爬虫·python·scrapy·数据分析
浊酒南街1 小时前
TensorFlow之微分求导
人工智能·python·tensorflow
立秋67891 小时前
用Python绘制梦幻星空
开发语言·python·pygame
alpszero1 小时前
YOLO11解决方案之对象裁剪探索
人工智能·python·计算机视觉·yolo11
白云千载尽2 小时前
相机、雷达标定工具,以及雷达自动标定的思路
python·自动驾驶·ros
咕噜咕噜啦啦2 小时前
python爬虫实战训练
爬虫·python
盛夏绽放2 小时前
Python字符串常用内置函数详解
服务器·开发语言·python
我想睡觉2612 小时前
Python训练营打卡DAY27
开发语言·python·机器学习
蹦蹦跳跳真可爱5892 小时前
Python----神经网络(基于DNN的风电功率预测)
人工智能·pytorch·python·深度学习·神经网络·dnn