function reload() {
window.location.reload()
}
setInterval(reload,2000)
</script>
### 长轮询
long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消 息才返回或超时,返回完之后,客户端再次建立连接,周而复始,基于事件的触发,一个事件接一个事件。
Ajax轮询与long poll都属于不断发送http请求,然后等待服务器处理,可以看到http协议一个特点,被动性,服务端不能主动联系客户端,只有客户端发起。
缺点:Ajax轮询需要服务器有很快的处理速度与快速响应。long poll需要很高的并发,体现在同时容纳请求的能力。
1、后端代码
‘’’
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
‘’’
from flask import Flask,render_template,request,session,redirect,jsonify
from uuid import uuid4
from queue import Queue,Empty
import json
app = Flask(name)
app.secret_key = “asdfasdfasdf”
UUUU = {
‘1’:{‘name’:‘王’,‘count’:1},
‘2’:{‘name’:‘李’,‘count’:1},
‘3’:{‘name’:‘赵’,‘count’:1},
}
为每个登录用户保存
dfasdfadsfasdfadf: Queue()
USER_QUEUE_DICT = {
}
@app.before_request
def check_login():
if request.path == ‘/login’:
return None
user_info = session.get(‘user_info’)
if not user_info:
return redirect(‘/login’)
@app.route(‘/login’,methods=[‘GET’,‘POST’])
def login():
if request.method == “GET”:
return render_template(‘login.html’)
else:
user = request.form.get(‘user’)
nid = str(uuid4())
USER_QUEUE_DICT[nid] = Queue()
session[‘user_info’] = {‘nid’:nid, ‘user’:user }
return redirect(‘/index’)
@app.route(‘/index’)
def index():
return render_template(‘index.html’,user_list = UUUU)
@app.route(‘/query’)
def query():
“”“每个用户查询最新投票信息”“”
ret = {‘status’:True,‘data’:None}
current_user_nid = session[‘user_info’][‘nid’]
queue = USER_QUEUE_DICT[current_user_nid]
try:
# {‘uid’:1, ‘count’:6}
ret[‘data’] = queue.get(timeout=10) #十秒后断开,再连
except Empty as e:
ret[‘status’] = False
# return jsonify(ret)
return json.dumps(ret)
@app.route(‘/vote’)
def vote():
“”"
用户投票
:return:
“”"
uid = request.args.get(‘uid’)
old = UUUU[uid][‘count’]
new = old + 1
UUUU[uid][‘count’] = new
for q in USER_QUEUE_DICT.values():
q.put({'uid':uid, 'count':new})
return "投票成功"
if name == ‘main’:
app.run(host=‘0.0.0.0’,threaded=True)
2、前端代码
- {% for k,v in user_list.items() %}
- {{k}}: {{v.name}} {{v.count}}
- {% endfor %}
### websocket
webSocket是html5一种新的协议,实现了浏览器与服务器之间的全双工通信,能很好的节省服务器资源与带宽,并在服务器端与浏览器端实现实时通行,他建立在TCP之上, 同http一样,通过tcp来传输数据。
只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,服务器端会知道连接的信息,知道客户端关闭请求,同时由服务器主动推送,当有信息需要发送时,直接发送。客户端的连接通过session对象存储,能够实现实时推送。
1、安装
pip3 install gevent-websocket
2、后端代码
‘’’
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
‘’’
from flask import Flask,render_template,request,session,redirect,jsonify
import uuid
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
import json
app = Flask(name)
app.secret_key = ‘xfsdfqw’
USERS = {
‘1’:{‘name’:‘王’,‘count’:0},
‘2’:{‘name’:‘李’,‘count’:0},
‘3’:{‘name’:‘赵’,‘count’:0},
}
@app.before_request
def before_request():
if request.path == ‘/login’:
return None
user_info = session.get(‘user_info’)
if user_info:
return None
return redirect(‘/login’)
@app.route(‘/login’,methods=[‘GET’,‘POST’])
def login():
if request.method == “GET”:
return render_template(‘login.html’)
else:
uid = str(uuid.uuid4())
session[‘user_info’] = {‘id’:uid,‘name’:request.form.get(‘user’)}
return redirect(‘/index’)
@app.route(‘/index’)
def index():
return render_template(‘index.html’,users=USERS)
为每个登录用户保存socket字典
WS_DICT = {
}
@app.route(‘/message’)
def message():
if request.environ.get(‘wsgi.websocket’):
ws = request.environ[‘wsgi.websocket’]
# 1. 刚连接成功
uid = session.get(‘user_info’).get(‘id’)
WS_DICT[uid] = ws
from geventwebsocket.websocket import WebSocket
while True:
# 2. 等待用户发送消息,并接受
message = ws.receive()
# 关闭:message=None
如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!