在Django中实现WebSocket通信常见的两种方法分别一种是通过dwebsocket和Channels,dwebsocket模块基于djangowebsocket开发(dwebsocket使用可以参考文章:Django实战018:dwebsocket成功实现WebSocket),但是由于djangowebsocket已经停止开发所以dwebsocket的更新也基本停滞了。Channels为提升Django的ASGI能力开发的插件,可以同时处理HTTP、HTTP2、WebSocket协议。channels在保留了原生django的同步和易用的特性上还带来了异步处理方式,并且将django自带的认证系统以及session集成到模块中,扩展性非常强(官方推荐的插件)。 安装Channels Python安装模块很简单,直接用pip来在线安装:pipinstallUchannels。channels安装需要下载很多依赖包,这些包用官方源容易下载超时(建议换源再装,pip换源可以参考文章:Django实战012:PIP配置国内镜像源及使用)。这里U指upgrade,如果已安装就升级到最新版。官方源安装很多依赖包下载的容易超时,建议换源再安装pipinstallUchannels也可以临时指定安装源,U指upgrade,如果已安装就升级到最新版pythonmpipinstallUchannelsihttps:pypi。tuna。tsinghua。edu。cnsimpleSuccessfullyinstalledAutomat20。2。0PyHamcrest2。0。2attrs20。3。0autobahn20。12。3cffi1。14。4channels3。0。3constantly15。1。0cryptography3。3。1daphne3。0。1hyperlink21。0。0idna3。1incremental17。5。0pyasn10。4。8pyasn1modules0。2。8pycparser2。20pyopenssl20。0。1serviceidentity18。1。0twisted20。3。0txaio20。12。1zope。interface5。2。0集成Channels框架 Django2。x不支持ASGI,所以实现WebSocket需要集成Channels框架(貌似Django3。x无依赖就支持WebSocket)。我们需要创建consumers。py和routing。py文件,routing。py相当于Django中的url用来映射路由和执行函数之间的关系。当监听到websocket的请求时,Django会根据routing。py来触发相应的执行函数。consumers。py则相当于Django中的views视图,在这里定义执行函数及相应的业务逻辑处理。在wsgi。py同级目录新增文件asgi。py(如果你安装了channels在创建项目会自动生成该文件,但是还是需要修改),将Django运行切换到ASGI而不是WSGI服务。importos,djangofromchannels。routingimportgetdefaultapplicationos。environ。setdefault(DJANGOSETTINGSMODULE,channelserver。settings)django。setup()applicationgetdefaultapplication()配置Channels 要在Django项目中使用Channels就需要将Channels库添加到已安装的应用程序列表中,编辑settings。py件将channels添加到INSTALLEDAPPS设置中。Channels走的是通道模式,所以我们需要设置Django以通道模式运行。通过ASGIAPPLICATION来指定Django开启通道。如果有多个通道的话可以使用Redis作为我们的通道层,这时候就需要安装asgiredis配合了(需安装redis)。INSTALLEDAPPS〔django。contrib。admin,django。contrib。auth,django。contrib。contenttypes,django。contrib。sessions,django。contrib。messages,django。contrib。staticfiles,corsheaders,跨域处理channels,注册Channels〕启用ASGIASGIAPPLICATIONchannelserver。routing。application定义routing。py 在项目settings文件同级目录中新增routing。py,利用Channels的routring模块中的方法来实现路由分发。如果你需要认证可以添加中间件AuthMiddlewareStack或者SessionMiddlewareStack,不需要则直接在URLRouter中定义路由指向。fromchannels。authimportAuthMiddlewareStackfromchannels。sessionsimportSessionMiddlewareStackfromchannels。routingimportProtocolTypeRouter,URLRouterfromdjango。urlsimportpath,repathfromchannelserver。consumersimportconsumersapplicationProtocolTypeRouter({websocket:AuthMiddlewareStack(websocket:SessionMiddlewareStack(URLRouter(〔Emptyfornow(httpdjangoviewsisaddedbydefault)path(wsparameterstr:roomname,consumers),path(ncdev,test()),〕))})定义consumers。py 这个是核心的功能模块,需要单独拿出来说明。这里我们就简单的测试下整个项目是否可以正常地运行和被访问,这里我们定义一个简单的test类来测试下Channels。当链接进来的时候我们打印链接上了,当我们接收到客户端消息的时候打印已发送数据,当客户端断开链接的时候我们打印链接断开啦。classtest(WebsocketConsumer):当Websocket创建连接时defconnect(self):self。accept()保持连接!必须写这步print(连接上啦)当Websocket接收到消息时defreceive(self,textdataNone,bytesdataNone):self。send(textdata)print(已发送数据)当Websocket发生断开连接时defdisconnect(self,code):print(断开连接啦)运行项目 当前项目运行环境为:python3。7。9Django2。2Channels3。0。3,项目运行直接通过命令:pythonmanagerunserver来启动。然后通过Vue前端向Django发送一个websocket请求,我们可以看到后台已经打印了字符符:webscoketrequest!!!(说明请求已经进来了)。 Channels测试 这里我们用个WebScoket客户端测试工具来测试下请求结果,分别点击链接、发送数据、断开来测试刚才的几个接口是否能正常响应。在右侧我们可以看到服务端给我们返回了我们发送的数据,说明我们的WebScoket链接已经成功建立并可以发送数据。 以上内容是小编给大家分享的【Django实战021:Channels实现WebSocket】。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。