以python web框架里面具有代表性的Django和Tornado为例
web框架从支持协议上可以分为http协议
和websocket协议
只用单线程,工作模式上分为同步阻塞模式
和异步非阻塞模式
Tornado包含以上所有的支持协议和工作模式
Django当然支持http协议,也可通过chanels支持websocket协议。是同步阻塞工作模式,不支持异步非阻塞。但实际使用感觉django也是异步非阻塞的,它的实现本质是多线程,和异步非阻塞只是效果一样,但不是一个概念
补充:默认情况下你使用./manage.py runserver会开启多个线程对HTTP请求进行伺服,所以第二个请求进来时虽然第一个请求仍在sleep,但已经新开了一个线程进行响应处理,看起来像是“非阻塞”的工作模式,其实质是多线程而非单线程,想禁用这一行为也已经给出了答案,加上–nothreading参数:./manage.py runserver --nothreading即可。
从支持协议出发:
http协议和websocket的相同点:
两者都是基于TCP协议,在浏览器和服务端都是通过Socket进行通信
不同点:
http协议是一种短连接,在一次请求响应结束之后就断开连接,需要WSGI(Web服务器网关接口,只支持http,不支持websocket)
websocket协议是一种长链接,保持着tcp连接,除了响应客户端请求外,还能主动想客户端发送消息,需要ASGI(异步网关协议接口,支持http和websocket)处理
websocket原理和Django下聊天室的应用,请分别参考:
https://blog.csdn.net/csdniter/article/details/98355667
https://github.com/yueshouhu/personal_talkhome.git
htttp协议在web框架中实现:
http协议基于tcp协议,都通过socket实现,区别在于传输数据的格式的不同
tcp直接传输任意字符串的字节形式
http协议传输数据包括请求头和请求体及格式要求,web框架主要就是用socket,数据格式处理来实现http协议下数据传输,Django和Tornado实现http协议方式相同
websocket协议在web框架中实现:
Tornado:
tornado本身支持websocket
import tornado.websocket
class ChatHandler(tornado.websocket.WebSocketHandler):
'''websocket请求'''
def open(self):
"""
客户端连接成功时,自动执行
:return:
"""
pass
def on_message(self, message):
"""
客户端连发送消息时,自动执行
:param message:
:return:
"""
pass
def on_close(self):
"""
客户端关闭连接时,,自动执行
:return:
"""
pass
详情请参考:
https://blog.csdn.net/csdniter/article/details/98505391 用Tornado实现的简易聊天室
Django
Django中要支持websocket协议,需要借助channels(第三方库)或其它
其中的方法功能和tornado相同,只是需要额外的配置和不同的写法
具体请参考
官方文档:https://channels.readthedocs.io/en/latest/tutorial/
在Django下实现的聊天室应用:https://github.com/yueshouhu/personal_talkhome.git