需求

用户在投票的页面可以实时的监测到,投票详情

在这里我会通过轮询和长轮询(推荐使用这个,可以减少请求数,实时性也好)的方法来实现

基于轮询实现投票系统

大致的思路是前端开启一个定时器每隔10秒定时的向服务器获取投票的结果

from flask import Flask,render_template,request,jsonify

app = Flask(__name__)

USERS = {

'1':{'name':'贝贝','count':1},

'2':{'name':'小东北','count':0},

'3':{'name':'何伟明','count':0},

}

@app.route('/user/list')

def user_list():

import time

return render_template('user_list.html',users=USERS)

@app.route('/vote',methods=['POST'])

def vote():

uid = request.form.get('uid')

USERS[uid]['count'] += 1

return "投票成功"

@app.route('/get/vote',methods=['GET'])

def get_vote():

return jsonify(USERS)

if __name__ == '__main__':

# app.run(host='192.168.13.253',threaded=True)

app.run(threaded=True)

Title

cursor: pointer;

}

  • {% for key,val in users.items() %}
  • {{val.name}} ({{val.count}}){% endfor %}

$('#userList').on('dblclick','li',function () {

var uid= $(this).attr('uid');

$.ajax({

url:'/vote',

type:'POST',

data:{uid:uid},

success:function (arg) {

console.log(arg);

}

})

});

});/*获取投票信息*/function get_vote() {

$.ajax({

url:'/get/vote',

type:"GET",

dataType:'JSON',

success:function (arg) {

$('#userList').empty();

$.each(arg,function (k,v) {

var li= document.createElement('li');

li.setAttribute('uid',k);

li.innerText= v.name + "(" + v.count + ')';

$('#userList').append(li);

})

}

})

}

setInterval(get_vote,3000);

templates/user_list.html

缺点 : 获取票数的实时性不好,频繁的向服务器发送请求

基于长轮询实现投票系统

基本的思路:

前端: 通过递归发送查询投票详情的请求,更新数据  (数据驱动模型)

服务端 :如果没有人来投票服务器把所有用户的请求hang住10秒,把原有的信息返回,如果在这等待的10s中有人来投票,直接返回最新的结果给所有hang住的用户

基于队列queue的阻塞, 来实现hang住请求,queue的基本用法如下

import queue

q = queue.Queue()

val = q.get()

print(val)

try:

val = q.get(timeout=10)

print(val)

except queue.Empty:

pass

run.py

from flask import Flask,render_template,request,jsonify,session

import uuid

import queue

app = Flask(__name__)

app.secret_key = 'asdfasdfasd'

USERS = {

'1':{'name':'贝贝','count':1},

'2':{'name':'小东北','count':0},

'3':{'name':'何伟明','count':0},

}

QUEQUE_DICT = {

# 'asdfasdfasdfasdf':Queue()

}

@app.route('/user/list')

def user_list():

user_uuid = str(uuid.uuid4())

QUEQUE_DICT[user_uuid] = queue.Queue()

session['current_user_uuid'] = user_uuid

return render_template('user_list.html',users=USERS)

@app.route('/vote',methods=['POST'])

def vote():

uid = request.form.get('uid')

USERS[uid]['count'] += 1

for q in QUEQUE_DICT.values():

q.put(USERS)

return "投票成功"

@app.route('/get/vote',methods=['GET'])

def get_vote():

user_uuid = session['current_user_uuid']

q = QUEQUE_DICT[user_uuid]

ret = {'status':True,'data':None}

try:

users = q.get(timeout=10)

ret['data'] = users

except queue.Empty:

ret['status'] = False

return jsonify(ret)

if __name__ == '__main__':

app.run(host='192.168.13.253',threaded=True)

# app.run(threaded=True)

Title

cursor: pointer;

}

  • {% for key,val in users.items() %}
  • {{val.name}} ({{val.count}}){% endfor %}

$('#userList').on('click','li',function () {

var uid= $(this).attr('uid');

$.ajax({

url:'/vote',

type:'POST',

data:{uid:uid},

success:function (arg) {

console.log(arg);

}

})

});

get_vote();

});/*获取投票信息*/function get_vote() {

$.ajax({

url:'/get/vote',

type:"GET",

dataType:'JSON',

success:function (arg) {if(arg.status){

$('#userList').empty();

$.each(arg.data,function (k,v) {

var li= document.createElement('li');

li.setAttribute('uid',k);

li.innerText= v.name + "(" + v.count + ')';

$('#userList').append(li);

})

}

get_vote();

}

})

}

templates/user_list.html

python在线投票系统系统_基于轮询实现实时的在线投票系统相关推荐

  1. 【毕业设计系列】033:基于MATLAB语言的实时变声器系统【含Matlab源码】

    Date:2022.5.5 文章目录 前言 1.算法原理 2.实现效果 2.1.男声变女声 2.2.女声变男声 2.3.男声变大叔声 3.部分matlab代码实现 前言 在大学毕业设计中,要求实现一个 ...

  2. 【毕业设计/Matlab系列】基于MATLAB语言的实时变声器系统

    Date:2022.5.5 文章目录 前言 1.算法原理 2.实现效果 2.1.男声变女声 2.2.女声变男声 2.3.男声变大叔声 3.部分matlab代码实现 前言 在大学毕业设计中,要求实现一个 ...

  3. 《智能步态识别门禁系统》,基于深度学习的多人步态识别系统

    本文章仅仅提供一种自认为比较科学的方式去实现多人步态识别,如果对多人步态识别感兴趣,却又不知道如何实现的话,这篇文章将会有莫大的帮助.以下方法作者皆实验过是可行的方案.(训练集124人,准确率96%, ...

  4. python 优雅退出_Python学习教程:Python 使用 backoff 更优雅的实现轮询

    我们经常在开发中会遇到这样一种场景,即轮循操作.今天介绍一个Python库,用于更方便的达到轮循的效果--backoff. Python学习教程:Python 使用 backoff 更优雅的实现轮询 ...

  5. java ajax轮询代码_AJAX轮询的实时监控画面

    上一篇我们通过异步刷新Ajax 技术,来实现监控页面监控位号值的刷新,采用Ajax (AsynchronousJavascriptAndXML)技术,是指一种创建交互式.快速动态网页应用的网页开发技术 ...

  6. python dag调度系统开发_基于机器学习的DAG调度平台

    什么是DAG? 有向无环图 树形结构:除根节点,每个节点有且仅有一个上级节点,下级节点不限.根节点没有上级节点. 图结构:每个节点上级.下级节点数不限. DAG调度平台的定义及场景 任务调度是在各行各 ...

  7. python django做网页论文_基于PythonDjango框架的多媒体发布系统

    , Models. py 组成,其中 Urls.py 为整个项目的路由表,当使用者访问特 定的 url 时 , Urls.py 将请求指向 Views.py (视图函数)中特定 的函数,在视图函数中与 ...

  8. python dag调度系统开发_基于DAG的分布式任务调度平台-Maat

    背景 什么是Maat Maat是一个基于开源项目Airflow的流程调度系统,它支持用户自定义地组装流程节点,流程可以在用户指定的时间触发(支持crontab格式),或由用户手动触发. Maat的所有 ...

  9. python裂缝检测_基于卷积神经网络的高楼外墙裂缝检测系统

    fy the severity, general or slight damage degree of external wall cracks, and the effective identifi ...

最新文章

  1. [C/C++基础知识] 面试再谈struct和union大小问题
  2. Java并发编程—如何实现线程的超时中断
  3. 爬虫python 科研有用吗_为什么说用python写爬虫有优势?
  4. html中写随机数,为HTML生成一个随机数
  5. Java时间和日期指南
  6. LeetCode 642. 设计搜索自动补全系统(Trie树)
  7. mysql 8.0 重置数据库,Mysql 8.0安装及重置密码问题
  8. quartus生成qdb文件_(原创)详解Quartus导出网表文件:.qxp和.vqm
  9. jquery tmpl 详解
  10. 瑞利信道:从原理到实现
  11. linux壁纸图片不让复制,一些不常见到的LINUX壁纸,老规矩只提供给红联的兄弟姐妹...
  12. java软尾山地车评测_GT Sensor X Pro 软尾山地自行车测评
  13. 小学三年级另类语文题难住大学副教授(图)
  14. MongoDB的安装与可视化工具Studio 3T的安装
  15. android仿ppt,android 仿ppt进入动画效果合集
  16. 到底什么是5G LAN?
  17. Centos下如何永久修改系统时间 hwclock
  18. iOS开发 Tips 保存视频文件到相册
  19. 计算机音乐谱安娜的橱窗,钢琴谱 - 安娜的橱窗(2)
  20. 微信客服接口 报错40003

热门文章

  1. 睢宁 计算机学校,江苏睢宁中等专业学校2021年招生录取分数线
  2. 在处理时有错误发生: qmail qmail-run E: Sub-process /usr/bin/dpkg returned an error code (1)
  3. 截至2021年10月29日,安卓系统版本和Api Level对照表
  4. Springboot毕设项目扶贫管理系统p8k44(java+VUE+Mybatis+Maven+Mysql)
  5. Unity(三)三维数学和坐标系统
  6. 服务器托管怎么收费?
  7. linux--redis安装
  8. operation 04
  9. 爱普生打印机打印乱针与不自动到撕纸处处理办法
  10. python教程 w3c_W3C全套PDF教程 - 下载 - 搜珍网