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 连接
相关推荐
luthane几秒前
python 实现djb2哈希算法
python·算法·哈希算法
yz_518 Nemo16 分钟前
django的路由分发
后端·python·django
向上的车轮33 分钟前
Django学习笔记八:发布RESTful API
笔记·学习·django
向上的车轮1 小时前
Django学习笔记九:RESTAPI添加用户认证和授权
笔记·学习·django
山川而川-R1 小时前
Windows安装ollama和AnythingLLM
人工智能·python·语言模型·自然语言处理
大地之灯1 小时前
深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)
人工智能·python·深度学习·学习·算法
闲人编程1 小时前
elasticsearch实战应用
大数据·python·elasticsearch·实战应用
彤银浦2 小时前
python学习记录6
python·学习
码农超哥同学2 小时前
Python知识点:如何使用EdgeX Foundry与Python进行边缘计算
开发语言·python·面试·编程·边缘计算
码农超哥同学2 小时前
Python知识点:如何使用OpenFaaS与Python进行无服务器边缘计算
python·面试·serverless·编程·边缘计算