PeaceSheep's blog PeaceSheep's blog
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)

PeaceSheep

以最简洁、易懂的话解决问题
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)
  • C++

  • Python

    • Django

      • django3实现Websocket最简单demo
        • 1. 新建django项目
        • 2. 安装依赖
        • 3. 修改Asgi
        • 4. 新建消费者(类似于views,负责接受连接、接收消息等操作)
        • 5. 修改路由
      • Django和DRF莫名报403的离谱问题
  • Go

  • java

  • 语言
  • Python
  • Django
PeaceSheep
2022-03-14
目录

django3实现Websocket最简单demo

本文着重讲过程和步骤,不着重原理。根据本文步骤可配出来最简单的一个demo。

# 1. 新建django项目

# 2. 安装依赖

首先运行 pip install channels 安装channels。然后在setttings.py的INSTALLED_APPS里添加channels。注意每个app后面加上逗号。

# 3. 修改Asgi

将asgi.py文件的内容更改为:(这是一个仅支持http的写法,方便后面测试,支持websocket的路由后面会给出)

import os

from channels.routing import ProtocolTypeRouter
from django.core.asgi import get_asgi_application

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

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
})
1
2
3
4
5
6
7
8
9
10

在settings.py中添加(myproject替换为你的project名称) ASGI_APPLICATION = "myproject.asgi.application" 这个时候运行项目应该可以看到出现了: Starting ASGI/Channels version 3.0.4 development server at http://127.0.0.1:8000/

# 4. 新建消费者(类似于views,负责接受连接、接收消息等操作)

新建APP,假设为'backend'。在backend目录新建consumers.py,填写代码为:(类名自定义,和下面的代码对应就行)

import json
from channels.generic.websocket import WebsocketConsumer

class ChatConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()

    def disconnect(self, close_code):
        pass

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        self.send(text_data=json.dumps({
            'message': message
        }))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

注意这种写法要求前端发送的消息为json,且消息内容放在message key下。即前端发送的消息为 {"message":"消息内容"}, 如果不是这样的格式修改receive函数即可。该文件负责定义websocket的连接、接收消息等操作。

# 5. 修改路由

新建routing.py,填写内容为:

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/$', consumers.ChatConsumer.as_asgi()),
]

1
2
3
4
5
6
7
8

然后修改我们的asgi为:

import os

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import backend.routing

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

application = ProtocolTypeRouter({
  "http": get_asgi_application(),
  "websocket": AuthMiddlewareStack(
        URLRouter(
            backend.routing.websocket_urlpatterns
        )
    ),
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

OK,大功告成,此时后端的WebSocket就写好了,在配合一个前端就可以使用了。

编辑 (opens new window)
#Django#websocket
上次更新: 2025/04/15, 10:52:45
关于C++循环体没有可观察行为被编译器优化而导致的BUG
Django和DRF莫名报403的离谱问题

← 关于C++循环体没有可观察行为被编译器优化而导致的BUG Django和DRF莫名报403的离谱问题→

最近更新
01
ubuntu安装g++显示已有但是输入g++又找不到命令
04-15
02
使用cloudflare-r2搭建webdav
04-08
03
LLM聚合平台客户端对比
03-29
更多文章>
Theme by Vdoing | Copyright © 2022-2025 PeaceSheep
冀ICP备2022004632号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式