前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >django3 websockets

django3 websockets

作者头像
py3study
发布于 2020-10-16 02:48:03
发布于 2020-10-16 02:48:03
3.6K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

一、概述

现在Django 3.0附带了对ASGI的支持,将Websockets添加到Django应用中不需要任何额外的依赖关系。 在本文中,您将学习如何通过扩展默认的ASGI应用程序来使用Django处理Websocket。 我们将介绍如何在示例ASGI应用程序中处理Websocket连接,发送和接收数据以及实现业务逻辑。

注意:Django 3.0不支持dwebsocket模块,启动时,会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TypeError: WebSocketMiddleware() takes no arguments

因此,如果使用Django 3.0,必须使用channels

channels介绍

channels是以django插件的形式存在,它不仅能处理http请求,还提供对websocket、MQTT等长连接支持。不仅如此,channels在保留了原生django的同步和易用的特性上还带来了异步处理方式(channels2.X版本),并且将django自带的认证系统以及session集成到模块中,扩展性非常强。官方文档:https://channels.readthedocs.io/en/latest/index.html

安装以及安装需求

channels2.0最低django版本要求是1.11+,python3.5+

本文采用的是python 3.7.3,django 3.1

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

二、开始使用

环境说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Django==3.1channels==2.4.0paramiko==2.7.2uvicorn==0.11.8

新建项目:django3_websocket,应用名称:web

 看一下与settings.py同级目录。 您应该看到一个名为asgi.py的文件。 其内容如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os

from django.core.asgi import get_asgi_application

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

application = get_asgi_application()

该文件提供了默认的Django ASGI设置,并公开了一个名为application的ASGI应用程序,可以使用uvicorn或daphne等ASGI服务器运行该应用程序。 在进一步介绍之前,让我们看一下ASGI应用程序的结构。

ASGI应用程序结构

ASGI或“异步服务器网关接口”是用于使用Python构建异步Web服务的规范。它是WSGI的精神继承者,WSGI已被Django和Flask等框架使用了很长时间。 ASGI使您可以使用Python的本机异步/等待功能来构建支持长期连接的Web服务,例如Websockets和Server Sent Events。

ASGI应用程序是一个异步函数,它带有3个参数:作用域(当前请求的上下文),接收(一个异步函数,可让您侦听传入的事件)和发送(一个异步函数,可将事件发送至客户端)。

在ASGI应用程序内部,您可以根据范围字典中的值路由请求。例如,您可以通过检查scope [‘type’]的值来检查该请求是HTTP请求还是Websocket请求。要侦听来自客户端的数据,您可以等待接收功能。准备好将数据发送到客户端时,可以等待发送功能,然后将要发送给客户端的任何数据传递给客户端。让我们看一下这在示例应用程序中是如何工作的。

创建一个ASGI应用

在我们的asgi.py文件中,我们将使用我们自己的ASGI应用程序包装Django的默认ASGI应用程序功能,以便自己处理Websocket连接。为此,我们需要定义一个名为application的异步函数,该函数需要3个ASGI参数:scope,receive和send。将get_asgi_application调用的结果重命名为django_application,因为我们需要它处理HTTP请求。在我们的应用程序函数内部,我们将检查scope [‘type’]的值以确定请求类型。如果请求类型为“ http”,则该请求为普通的HTTP请求,我们应该让Django处理它。如果请求类型为“ websocket”,那么我们将自己处理逻辑。

在views.py的同级目录,创建文件asgi.py,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# !/usr/bin/python3
# -*- coding: utf-8 -*-
import os

from django.core.asgi import get_asgi_application

# 注意修改项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django3_websocket.settings')

django_application = get_asgi_application()


async def application(scope, receive, send):
    if scope['type'] == 'http':
        # Let Django handle HTTP requests
        await django_application(scope, receive, send)
    elif scope['type'] == 'websocket':
        # We'll handle Websocket connections here
        pass
    else:
        raise NotImplementedError(f"Unknown scope type {scope['type']}")

在views.py的同级目录,创建文件websocket.py,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async def websocket_application(scope, receive, send):
    while True:
        event = await receive()

        if event['type'] == 'websocket.connect':
            await send({
                'type': 'websocket.accept'
            })

        if event['type'] == 'websocket.disconnect':
            break

        if event['type'] == 'websocket.receive':
            if event['text'] == 'ping':
                await send({
                    'type': 'websocket.send',
                    'text': 'pong!'
                })

现在,我们需要创建一个函数来处理Websocket连接。 在与asgi.py文件相同的文件夹中创建一个名为websocket.py的文件,并定义一个名为websocket_application的ASGI应用程序函数,该函数接受3个ASGI参数。 接下来,我们将在我们的asgi.py文件中导入websocket_application,并在我们的应用程序函数内部调用它来处理Websocket请求,传入范围,接收和发送参数。 它看起来应该像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os

from django.core.asgi import get_asgi_application
# 注意修改应用名
from web.websocket import websocket_application

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

django_application = get_asgi_application()


async def application(scope, receive, send):
    if scope['type'] == 'http':
        await django_application(scope, receive, send)
    elif scope['type'] == 'websocket':
        await websocket_application(scope, receive, send)
    else:
        raise NotImplementedError(f"Unknown scope type {scope['type']}")

接下来,让我们为Websocket应用程序实现一些逻辑。我们将监听所有Websocket连接,当客户端发送字符串“ ping”时,我们将以字符串“ pong!”进行响应。

在websocket_application函数内部,我们将定义一个不确定的循环,该循环将处理Websocket请求,直到关闭连接。在该循环内,我们将等待服务器从客户端收到的任何新事件。然后,我们将根据事件的内容采取行动,并将响应发送给客户端。

首先,让我们处理连接。当新的Websocket客户端连接到服务器时,我们将收到“ websocket.connect”事件。为了允许这种连接,我们将发送一个“ websocket.accept”事件作为响应。这将完成Websocket握手并与客户端建立持久连接。

当客户端终止其与服务器的连接时,我们还需要处理断开连接事件。为此,我们将监听“ websocket.disconnect”事件。当客户端断开连接时,我们将摆脱不确定的循环。

最后,我们需要处理来自客户端的请求。为此,我们将监听“ websocket.receive”事件。当我们从客户端收到“ websocket.receive”事件时,我们将检查event [‘text’]的值是否为“ ping”。如果是,我们将发送一个’websocket.send’事件,其文本值为’pong!’。

测试

现在,我们的ASGI应用程序已设置为处理Websocket连接,并且我们已经实现了Websocket服务器逻辑,让我们对其进行测试。 目前,Django开发服务器不使用asgi.py文件,因此您将无法使用./manage.py runserver测试连接。 相反,您需要使用ASGI服务器(例如uvicorn)运行该应用程序。 让我们安装它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip3 install uvicorn

安装uvicorn后,我们可以使用以下命令运行ASGI应用程序:

注意:打开cmd控制台,切换到项目django3_websocket目录,执行命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uvicorn web.asgi:application

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
?[32mINFO?[0m:     Started server process [?[36m15320?[0m]
?[32mINFO?[0m:     Waiting for application startup.
?[32mINFO?[0m:     ASGI 'lifespan' protocol appears unsupported.
?[32mINFO?[0m:     Application startup complete.
?[32mINFO?[0m:     Uvicorn running on ?[1mhttp://127.0.0.1:8000?[0m (Press CTRL+C to quit)

如果出现以下报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    'DIRS': [os.path.join(BASE_DIR, 'templates')]
NameError: name 'os' is not defined

请修改settings.py,在顶头部分,导入os模块。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os

再次执行uvicorn 命令即可。

访问页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://127.0.0.1:8000

效果如下:

要测试Websocket连接,请在新选项卡中打开浏览器的开发工具。 在控制台中,创建一个名为ws的新Websocket实例,该实例指向ws:// localhost:8000 /。 然后将onmessage处理程序附加到将event.data记录到控制台的ws。 最后,调用ws.send(’ping’)将消息发送到服务器。 您应该看到值“ pong!”。 登录到控制台。

请依次输入以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ws = new WebSocket('ws://localhost:8000/')
ws.onmessage = event => console.log(event.data)
ws.send("ping")

效果如下:

 恭喜! 现在,您知道了如何使用ASGI将Websocket支持添加到Django应用程序中。 去用它来制作很棒的东西。

本文参考链接:

https://www.mindg.cn/?p=2489

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
shiro中的验证用户身份认证以及授权
  7.1 生成加密密码PasswordHelper类(盐加密)    MD5+散列1024+Hex/Base64
用户10196776
2022/11/22
1.4K0
shiro中的验证用户身份认证以及授权
十分钟带你轻松入门Shiro
Shiro通过在web.xml配置文件中配置的ShiroFilter来拦截所有请求,并通过配置filterChainDefinitions来指定哪些页面受保护以及它们的权限。
wangweijun
2022/01/10
4920
十分钟带你轻松入门Shiro
shiro框架的基本理解[通俗易懂]
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
全栈程序员站长
2022/10/03
5340
shiro框架是什么_中国历史知识框架
2.Shiro权限框架 2.1 概念 2.2 Apache Shiro 与Spring Security区别
全栈程序员站长
2022/10/05
5820
shiro框架是什么_中国历史知识框架
shiro权限管理框架与springmvc整合
shiro是apache下的一个项目,和spring security类似,用于用户权限的管理‘
肖哥哥
2019/02/22
5910
shiro权限管理框架与springmvc整合
这可能是最全的Shiro入门(整合SSM)
基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。
上分如喝水
2022/04/13
2.4K0
这可能是最全的Shiro入门(整合SSM)
Shiro的原理及Web搭建
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
Java团长
2018/10/18
8630
Shiro的原理及Web搭建
安全框架Shiro和SpringSecurity的比较
首先Shiro较之 Spring Security,Shiro在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势。
Java编程指南
2020/05/13
8820
浅谈Apache Shiro权限模块及数据库设计
写在最最最~~~前面的:由于Shiro框架在学习过程中假如没有一个实例Demo的参考,理解起来可能较为生涩难懂,所以笔者建议大家参考这个开源的项目:点我下载项目,该项目是我在学习Apache Shiro过程中参考的项目,我在原项目的基础上增加了一些便于理解的注释等,项目采用前后分离的方式开发,原作者:点我查看
关忆北.
2020/10/15
1.5K0
ssm整合shiro详解
这里有详细的ssm整合shiro步骤,需要先搭建ssm框架,教程在 https://blog.csdn.net/qq_41150890/article/details/108419455
全栈程序员站长
2022/06/27
3630
ssm整合shiro详解
安全框架shiro和springSecurity的比较
首先Shiro较之 Spring Security,Shiro在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势。
软件小生活
2022/03/29
8460
安全框架shiro和springSecurity的比较
从权限控制到shiro框架的应用
说明:本文很多观点和内容来自互联网以及各种资料,如果侵犯了您的权益,请及时联系我,我会删除相关内容。 权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。 用户身份认证 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简
神秘的寇先森
2018/05/30
2.4K0
Shiro安全框架入门篇(登录验证实例详解)
Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都可以使用。它主要用来处理身份认证,授权,企业会话管理和加密等。Shiro的具体功能点如下:
Java团长
2018/08/03
8980
基于权限安全框架Shiro的登录验证功能实现
目前在企业级项目里做权限安全方面喜欢使用Apache开源的Shiro框架或者Spring框架的子框架Spring Security。
SmileNicky
2019/01/17
8620
Shiro框架02权限认证+MD5加盐加密+散列1024+Hex/Base64(源码)
                           用户与角色                                              角色与权限
天蝎座的程序媛
2022/11/18
7040
Shiro框架02权限认证+MD5加盐加密+散列1024+Hex/Base64(源码)
Apache Shiro 使用手册 原
一、什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能: 
wuweixiang
2018/08/14
9870
Shiro
Apache Shiro是Java的一个安全框架。它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案。 Apache Shiro相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,能更简单的解决项目问题就好了。Shiro不仅可以用在JavaSE环境,也可以用在JavaEE环境帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。而且Shiro的API也是非常简单。
宋先生
2019/07/18
9290
Shiro
Shiro第二篇【授权、整合Spirng、过滤器】
前言 本文主要讲解的知识点有以下: Shiro授权的方式简单介绍 与Spring整合 初始Shiro过滤器 一、Shiro授权 上一篇我们已经讲解了Shiro的认证相关的知识了,现在我们来弄Shiro
Java3y
2018/04/02
9430
Shiro第二篇【授权、整合Spirng、过滤器】
shiro+SSM
当前的操作用户 可以是人 爬虫 当前跟软件交互的东西 在shiro当中我们可以统称"用户" 在代码的任何地方,你都能轻易的获得Shiro Subject。 一旦获得Subject,你就可以立即获得你希望用Shiro为当前用户做的90%的事情:登录、退、访问会话、执行授权检查等
JokerDJ
2023/11/27
2750
shiro+SSM
day55_BOS项目_07
第一步:我们使用 PowerDesigner 通过 权限控制.pdm文件 生成 建表文件bos_qx.sql,为了避免外键名冲突,需要修改建表文件的外键名称和删除生成的t_user表的语句(因为该表之前已经生成过了)。 第二步:再将建表文件拖入 Navicat for MySQL 中生成数据库中对应的5张表格。 第三步:我们再使用MyEclipse中的Hibernate反转引擎生成实体类文件和对应的Hibernate映射文件。 第四步:将反转生成的文件拷贝至Eclipse中的项目中去,简单修正一下拷贝的文件(修正2个地方)。新反转生成的User.hbm.xml文件与老的User.hbm.xml文件合并,注意:不要删掉老文件中手动添加的内容。
黑泽君
2018/10/12
4770
day55_BOS项目_07
相关推荐
shiro中的验证用户身份认证以及授权
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验