Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >vue+django实现websocket连接

vue+django实现websocket连接

作者头像
py3study
发布于 2021-02-25 07:58:53
发布于 2021-02-25 07:58:53
4K30
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

一、概述

在项目中,需要使用websocket,来展示一些实时信息。

这里使用django 3.1.5

二、django项目

安装模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip3 install django-cors-headers channels

新建项目websocket_demo

修改websocket_demo/asgi.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
# Import other Channels classes and consumers here.
from channels.routing import ProtocolTypeRouter, URLRouter
# from apps.websocket_app.urls import websocket_urlpatterns
from websocket_demo.urls import websocket_urlpatterns

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

# application = get_asgi_application()
application = ProtocolTypeRouter({
    # Explicitly set 'http' key using Django's ASGI application.
    "http": get_asgi_application(),
    'websocket': AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

修改websocket_demo/settings.py

注册corsheaders和channels,corsheaders主要是用来解决跨域问题的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'api.apps.ApiConfig',
    'corsheaders',  # 注册应用cors
    'channels'
]

注册中间件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'corsheaders.middleware.CorsMiddleware',  # 注册组件cors
]

最后一行增加以下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_METHODS = (
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
)

# 指定ASGI的路由地址
ASGI_APPLICATION = 'websocket_demo.asgi.application'

注意:ASGI是用来做异步请求的。

websocket_demo.asgi.application 表示,websocket_demo/asgi.py里面的application

修改websocket_demo/urls.py

增加websocket路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.urls import path
from api.views import ChatConsumer

urlpatterns = [
    path('admin/', admin.site.urls),
]

websocket_urlpatterns = [
    # 前端请求websocket连接
    path('wx/', ChatConsumer.as_asgi()),
]

修改api/views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.shortcuts import render

from channels.generic.websocket import WebsocketConsumer
import json
import time

# Create your views here.
class ChatConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()

    def disconnect(self, close_code):
        pass

    def receive(self, text_data):
        """
        接收消息
        :param text_data: 客户端发送的消息
        :return:
        """
        print(text_data)
        poetryList = [
            "云想衣裳花想容",
            "春风拂槛露华浓",
            "若非群玉山头见",
            "会向瑶台月下逢",
        ]
        for i in poetryList:
            time.sleep(0.5)
            self.send(i)

说明:

这里主要介绍receive,它是用来接收/发送消息的。即可以接收客户端,也就是vue发送的消息。也可以发送消息给客户端。

最后启动django项目即可

三、vue项目

新建一个vue项目,安装ElementUI 模块即可。

新建test.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div style="width: 70%;margin-left: 30px;margin-top: 30px;">
    <el-table
      :data="content"
      style="width: 100%;">
      <el-table-column
        prop="info"
        label="实时执行日志"
      >
      </el-table-column>
    </el-table>
    <br>
    <el-button type="primary" @click="onSubumit">提交</el-button>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        content:[],
      }
    },
    mounted: function() {

    },
    methods: {
      onSubumit(){
        // 清空消息
        this.content = []
        // 执行webSocket
        this.webSocket()
      },
      webSocket() {
        const _this = this;
        if (typeof (WebSocket) == 'undefined') {
          this.$notify({
            title: '提示',
            message: '当前浏览器无法接收实时报警信息,请使用谷歌浏览器!',
            type: 'warning',
            duration: 0
          });
        } else {
          // 实例化socket
          const socketUrl = 'ws://127.0.0.1:8000/wx/';
          this.socket = new WebSocket(socketUrl);
          // 监听socket打开
          this.socket.onopen = function() {
            console.log('浏览器WebSocket已打开');
            //发送字符:
            _this.socket.send(JSON.stringify({
              'username': "xiao",
              'msg': "hello",
            }));
          };
          // 监听socket消息接收
          this.socket.onmessage = function(msg) {
            // 追加到内容显示列表中
            _this.content.push({"info":msg.data})
          };
          // 监听socket错误
          this.socket.onerror = function() {
            _this.$notify({
              title: '错误',
              message: '服务器错误,无法接收实时报警信息',
              type: 'error',
              duration: 0
            });
          };
          // 监听socket关闭
          this.socket.onclose = function() {
            console.log('WebSocket已关闭');
          }
        }
      },
    }
  }
</script>

<style>
</style>

访问测试页面

点击提交,效果如下:

本文参考链接:

https://blog.csdn.net/qq_16687863/article/details/112340769

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
3 条评论
热度
最新
可以加个联系方式咨询一下吗,博主
可以加个联系方式咨询一下吗,博主
回复回复点赞举报
TypeError: app() missing 2 required positional arguments: 'receive' and 'send'
TypeError: app() missing 2 required positional arguments: 'receive' and 'send'
11点赞举报
经过测试,这个方法可行的,但是对(django,channels)版本有固定要求,否则就会报错。
经过测试,这个方法可行的,但是对(django,channels)版本有固定要求,否则就会报错。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复
技术栈:vue3 + element-plus + axios + pinia + router + Django5 + websocket + 讯飞星火API
用户11404404
2025/04/17
950
【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!
本文基于之前的一个旅游网站,实现 Django 连接 vue3,使 vue3 能携带 CSRF Token 发送 axios 请求给后端,后端再响应数据给前端。想要源码直接滑倒底部。
用户11404404
2025/04/08
1410
【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!
【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现
WebSocket是一种先进的通信协议,旨在通过单个长时间运行的连接实现实时双向数据交换,极大地提升了Web应用程序的交互性和响应速度。不同于传统的HTTP请求-响应模型,WebSocket在客户端与服务器之间开启了一个持久化的连接,使得双方可以随时发送文本或二进制数据,无需为每次通信重新建立连接,从而减少了延迟并提高了效率。这种特性特别适用于需要实时更新的应用场景,如在线游戏、即时通讯、金融交易监控等。WebSocket协议不仅简化了开发流程,还确保了更高效的数据传输,支持更高的并发量和更低的资源消耗,成为现代Web开发中不可或缺的技术之一。此外,随着互联网技术的发展,WebSocket正逐渐成为构建高度互动和动态Web应用的标准选择,为企业提供前所未有的用户体验改进机会。
用户11404404
2025/03/06
1670
💬 使用 Django + Ollama 打造本地私有化对话网站(全功能详解版)
当前大模型应用如雨后春笋,但很多用户对云端模型(如 GPT、Claude)存在数据隐私和成本担忧。Ollama 提供了本地运行主流大模型的能力,而 Django 是稳定、可扩展的 Web 框架。结合两者,我们可以打造一套完全离线、可控、安全的 AI 对话系统。
IT蜗壳-Tango
2025/04/07
1060
Django3+websocket+paramiko实现web页面实时输出
在上一篇文章中,简单在浏览器测试了websocket,链接如下:https://www.cnblogs.com/xiao987334176/p/13615170.html
py3study
2020/10/14
3.5K0
Django使用Channels实现WebSocket--下篇
通过上一篇《Django使用Channels实现WebSocket--上篇》的学习应该对Channels的各种概念有了清晰的认知,可以顺利的将Channels框架集成到自己的Django项目中实现WebSocket了,本篇文章将以一个Channels+Celery实现web端tailf功能的例子更加深入的介绍Channels
37丫37
2019/05/06
1.7K0
Django使用Channels实现WebSocket--下篇
Django使用Channels实现WebSocket--上篇
WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket允许服务端主动向客户端推送数据。在WebSocket协议中,客户端浏览器和服务器只需要完成一次握手就可以创建持久性的连接,并在浏览器和服务器之间进行双向的数据传输。
37丫37
2019/04/25
4K0
Django使用Channels实现WebSocket--上篇
实战 | 使用 Python 开发一个在线聊天室
在线聊天室在如今的互联网是一个很常见的产品,在各类电商的网页客服中,我们都可以接触到在线聊天。还有一个培训机构,你一打开他的网页,立马就弹出一个在线聊天框,防不胜防。
州的先生
2021/09/08
4K1
【玩转全栈】---- Django 基于 Websocket 实现群聊(解决channel连接不了)
【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现_django websocket-CSDN博客
用户11404404
2025/03/22
860
【玩转全栈】---- Django 基于 Websocket 实现群聊(解决channel连接不了)
Django Channels配置
Channels包装了Django的原生异步视图支持(Django3之后支持异步视图),允许Django项目不仅可以处理HTTP,还可以处理WebSockets,MQTT等。Channels提供了与Django的身份验证系统,会话系统等的集成,使得将纯HTTP项目扩展到其他协议比以往任何时候都更容易。因此,通常我们在Django3上实现websocket还是会使用channels
zy010101
2021/12/07
1.2K0
Django Channels配置
Django使用Channels实现websocket
由于项目有个需要实时显示状态的需求,搜索了各种实现方法,看来只有websocket最靠谱,但django原生是不支持websocket的,最终发现了chango-channels这个项目。可以帮我们实现我们的需求。
earthchen
2020/09/24
2.5K0
Django Channels websocket 搭建实践(实现长链接消息通知功能)
信道层是一种通信系统。它允许多个消费者实例彼此交谈,以及与 Django 的其他部分交谈。 通道层提供以下抽象: 通道是一个可以将邮件发送到的邮箱。每个频道都有一个名称。任何拥有频道名称的人都可以向频道发送消息。 一组是一组相关的通道。一个组有一个名称。任何具有组名称的人都可以按名称向组添加/删除频道,并向组中的所有频道发送消息。无法枚举特定组中的通道。 每个使用者实例都有一个自动生成的唯一通道名,因此可以通过通道层进行通信。 在我们的聊天应用程序中,我们希望同一个房间中的多个聊天消费者实例相互通信。为此,我们将让每个聊天消费者将其频道添加到一个组,该组的名称基于房间名称。这将允许聊天用户向同一房间内的所有其他聊天用户发送消息。 我们将使用一个使用 redis 作为后备存储的通道层。要在端口 6379 上启动 Redis 服务器,首先系统上安装 redis,并启动。
卓越笔记
2023/02/18
2.3K0
Django Channels websocket 搭建实践(实现长链接消息通知功能)
使用daphne部署django channles websocket 项目
在上一篇文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/14361893.html
py3study
2021/03/30
6.6K0
Django基于websocket实现群聊功能
Django支持http协议和websocket协议,并且可以识别不同协议请求的原因是channels的ProtocolTypeRouter类的下面代码:
GH
2020/03/19
1K0
django-channels实现群聊
Layer是一种通信系统。它允许多个消费者实例相互交谈,以及与 Django 的其他部分交谈。借助Layer可以很方便的实现群聊功能。无需我们手动管理websocket连接。
zy010101
2021/12/08
1.7K0
Django中WebSocket的实现与优化策略,包括断线重连机制
WebSocket技术在现代Web应用程序中越来越受欢迎,它提供了一种双向通信的方式,使得实时性应用程序的开发变得更加容易。在Django中,使用WebSocket可以实现实时通信,例如聊天应用、实时更新等。本文将介绍如何在Django中实现WebSocket以及一些优化策略。
一键难忘
2024/07/08
1.7K0
详述WebSocket原理
WebSocket协议和HTTP协议一样,都是在ISO七层模型的最顶层——应用层。WebSocket允许服务器端主动向客户端推送数据。在WebSocket协议中,客户端浏览器和服务器只需要完成一次握手就可以创建持久性的连接,并在浏览器和服务器之间进行双向的数据传输——全双工通讯。
码农编程进阶笔记
2021/07/20
2.1K0
Django Channels实现Zabbix实时告警到页面
Geewolf:《FastDFS分布式存储实战》作者,国内第一本《Ansible中文手册》译者、Flamingo、FMS作者
Zabbix
2021/02/03
2.3K0
Django使用channels实现通信
安装依赖包 pip install channels channels-redis .
王瑞MVP
2022/12/28
4600
Django使用channels实现通信
websocket
这时启动django项目会报错CommandError: You have not set ASGI_APPLICATION, which is needed to run the server.
GH
2020/03/19
2.9K0
推荐阅读
相关推荐
【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验