Django动态随机生成温度前端实时动态展示源码示例

目录
  • 随机生成温度 前端动态实时
    • 一、django APScheduler定时任务
      • 简介
      • 安装
      • 使用步骤
      • 基础组件
    • 二、dwebsocket
      • 简介
      • 安装
      • 使用方法
      • 属性和方法
      • 为了模拟随机的温度显示,在models中的表中的数据
      • views
      • 路由
      • VUE中的代码

随机生成温度 前端动态实时

一、django APScheduler定时任务

简介

APScheduler的全称是Advanced Python Scheduler。
它是一个轻量级的 Python 定时任务调度框架。
APScheduler 支持三种调度任务:
固定时间间隔,
固定时间点(日期),
Linux 下的 Crontab命令。
同时,它还支持异步执行、后台执行调度任务。

安装

pip install APScheduler

使用步骤

新建一个 schedulers (调度器) 。
添加一个调度任务(job stores)。
运行调度任务。

基础组件

APScheduler 有四种组件,分别是:调度器(scheduler),作业存储(job store),触发器(trigger),执行器(executor)。

schedulers(调度器)
它是任务调度器,属于控制器角色。它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。

triggers(触发器)
描述调度任务被触发的条件。不过触发器完全是无状态的。

job stores(作业存储器)
任务持久化仓库,默认保存任务在内存中,也可将任务保存都各种数据库中,任务中的数据序列化后保存到持久化数据库,从数据库加载后又反序列化。

executors(执行器)
负责处理作业的运行,它们通常通过在作业中提交指定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。

7个调度器

BlockingScheduler
调度器在当前进程的主线程中运行,也就是会阻塞当前线程。

BackgroundScheduler
调度器在后台线程中运行,不会阻塞当前线程。

AsyncIOScheduler
结合 asyncio 模块(一个异步框架)一起使用。

GeventScheduler
程序中使用 gevent(高性能的Python并发框架)作为IO模型,和 GeventExecutor 配合使用。

TornadoScheduler
程序中使用 Tornado(一个web框架)的IO模型,用 ioloop.add_timeout 完成定时唤醒。

TwistedScheduler
配合 TwistedExecutor,用 reactor.callLater 完成定时唤醒。

QtScheduler
你的应用是一个 Qt 应用,需使用QTimer完成定时唤醒。

二、dwebsocket

简介

WebSocket它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。

安装

pip install dwebsocket

使用方法

如果你想为一个单独的视图处理一个websocklet连接可以使用accept_websocket装饰器,它会将标准的HTTP请求路由到视图中。使用require_websocke装饰器只允许使用WebSocket连接,会拒绝正常的HTTP请求。

属性和方法

1.request.is_websocket()
如果是个websocket请求返回True,如果是个普通的http请求返回False,可以用这个方法区分它们。

2.request.websocket
在一个websocket请求建立之后,这个请求将会有一个websocket属性,用来给客户端提供一个简单的api通讯,如果request.is_websocket()是False,这个属性将是None。

3.WebSocket.wait()
返回一个客户端发送的信息,在客户端关闭连接之前他不会返回任何值,这种情况下,方法将返回None

4.WebSocket.read()
 如果没有从客户端接收到新的消息,read方法会返回一个新的消息,如果没有,就不返回。这是一个替代wait的非阻塞方法

5.WebSocket.count_messages()
 返回消息队列数量

6.WebSocket.has_messages()
 如果有新消息返回True,否则返回False

7.WebSocket.send(message)
 向客户端发送消息

8.WebSocket.__iter__()
 websocket迭代器

ok,现在我们进入到项目中

为了模拟随机的温度显示,在models中的表中的数据

from django.db import models
# Create your models here.
class Temperature(models.Model):
    wendu = models.IntegerField()
    add_time = models.DateTimeField(auto_now_add=True)
    class Meta:
        db_table='temperature'

views

from django.shortcuts import render,HttpResponse
from dwebsocket.decorators import accept_websocket
from apscheduler.schedulers.background import BackgroundScheduler
from . models import *
import random
import datetime
import json
def temperature():
    # 随机生成1-50之间的温度,加入到temperature表中
    data = random.randint(1,50)
    Temperature.objects.create(wendu=data)
# 定时任务三部曲 一秒钟执行一次
scheduler = BackgroundScheduler()
scheduler .add_job(temperature, 'interval', seconds=1)
scheduler.start()
clients = []
# 使用websocket中的 @accept_websocket装饰器
@accept_websocket
def websocket_conn(request):
    # 获取连接
    if request.is_websocket:
        # 新增 用户  连接信息
        clients.append(request.websocket)
        # 监听接收客户端发送的消息 或者 客户端断开连接
        for message in request.websocket:
            break
 # 发送消息
def websocketMsg(client, msg):
    b1 = json.dumps(msg,ensure_ascii=False).encode('utf-8')
    client.send(b1)
# 服务端发送消息
def send():
    if clients:
        for i in clients:
            wendu = Temperature.objects.order_by('-id').first()
            websocketMsg(i, {'wendu': wendu.wendu})
    return HttpResponse("ok")
# 定时任务 1秒/次
scheduler = BackgroundScheduler()
scheduler.add_job(send,'interval',seconds = 1)
scheduler.start()

路由

from django.urls import path
from . import views
urlpatterns = [
    path('websocket_conn/',views.websocket_conn)
]

VUE中的代码

<template>
    <div>
        当前的温度是:{{wendu}}
    </div>
</template>
<script>
import axios from 'axios'
export default {
    data() {
        return {
            wendu:0
        }
    },
    methods: {
        getWenDu(){
            var socket = new WebSocket("ws:127.0.0.1:8000/user/websocket_conn/");
               socket.onopen = function () {
                console.log('连接成功啦');//成功连接上Websocket
            };
            socket.onmessage = (e=>{
                let data = JSON.parse(e.data);//打印服务端返回的数据
                this.wendu = data['wendu']
                console.log(data['wendu'])
            })
            socket.onclose=function(e){
                console.log(e);
                socket.close(); //关闭TCP连接
            };
        }
    },
    created() {
        this.getWenDu()
    }
}
</script>
<style scoped>
</style>

效果如下:

然后我们写一个接口 展示出10秒钟的温度变化

class TestAPIView(APIView):
    def get(self,request):
        # 当前时间
        now = datetime.datetime.now()
        # 显示10秒前的温度
        datelist = []
        wendulist = []
        for i in range(10,0,-1):
            start_time = datetime.datetime.strftime(now-datetime.timedelta(seconds=i),"%Y-%m-%d %H:%M:%S")    # 当前时间
            end_time = datetime.datetime.strftime(now-datetime.timedelta(seconds=i-1),"%Y-%m-%d %H:%M:%S")   # 结束时间
            # 获取在开始时间之后 结束时间之前的的温度
            wendu = Temperature.objects.filter(add_time__gte=start_time,add_time__lte=end_time).all()
            dict = {}
            for i in wendu:
                dict['wendu'] = i.wendu
            for k,v in dict.items():
                wendulist.append(v)
            # print(wendulist)
            datelist.append(start_time)
        return Response({'datelist':datelist,'wendulist':wendulist})

这样呢 我们就拿到数据 如下图

最后,我们利用echarts在前端渲染 最终效果

<template>
    <div>
        当前的温度是:{{wendu}}
        <div id="main" style="width: 800px;height:400px;">
        </div>
    </div>
</template>
<script>
import axios from 'axios'
import * as echarts from 'echarts';
export default {
    data() {
        return {
            wendu:0,
            datelist:[],
            wendulist:[]
            }
    },
    methods: {
    // echarts
        getTest1(){
            var chartDom = document.getElementById('main');
            var myChart = echarts.init(chartDom);
              let  option = {
                xAxis: {
                    type: 'category',
                    data: this.datelist
                },
                yAxis: {
                    type: 'value',
                },
                series: [{
                    data: this.wendulist,
                    type: 'line',
                    smooth: true
                }]
            };
            myChart.setOption(option);
        },
        // 获取接口
        getTest(){
            this.axios.get('user/test/').then(res=>{
                console.log(res.data)
                this.datelist = res.data.datelist
                this.wendulist = res.data.wendulist
                this.getTest1()
                this.getWenDu()
            })
        },
        getWenDu(){
            var socket = new WebSocket("ws:127.0.0.1:8000/user/websocket_conn/");
                socket.onopen = function () {
                console.log('连接成功啦');//成功连接上Websocket
            };
            socket.onmessage = (e=>{
                let data = JSON.parse(e.data);//打印服务端返回的数据
                this.wendu = data['wendu']
                console.log(data['wendu'])
            })
            socket.onclose=function(e){
                console.log(e);
                socket.close(); //关闭TCP连接
            };
        }
    },
    mounted() {
        this.getWenDu()
        this.getTest()
        // this.getTest1()
    }
}
</script>
<style scoped>
</style>

以上就是Django动态随机生成温度前端实时动态展示源码示例的详细内容,更多关于Django动态随机生成温度前端实时动态展示的资料请关注我们其它相关文章!

(0)

相关推荐

  • 在Django中创建动态视图的教程

    在我们的`` current_datetime`` 视图范例中,尽管内容是动态的,但是URL ( /time/ )是静态的. 在 大多数动态web应用程序,URL通常都包含有相关的参数. 举个例子,一家在线书店会为每一本书提供一个URL,如:/books/243/./books/81196/. 让我们创建第三个视图来显示当前时间和加上时间偏差量的时间,设计是这样的: /time/plus/1/ 显示当前时间+1个小时的页面 /time/plus/2/ 显示当前时间+2个小时的页面 /time/p

  • Django结合ajax进行页面实时更新的例子

    Django结合ajax进行页面实时更新踩过的坑 简单记录一下在使用Django.echarts和ajax实现数据动态更新时遇到的一些坑: 1.url配置错误,路径没有找对(最后使用绝对路径) 2.后台(view.py)传的数据类型不对导致 3.没有配置js源,根本发不出ajax请求(第一次接触js,根本不知道这个大坑..) 4.不知道哪里报错可以根据XMLHttpRequest.status.XMLHttpRequest.readyState和textStatus进行分析 5.(现在还没弄明白

  • Django+Ajax+jQuery实现网页动态更新的实例

    views.py中的修改 增加相应的请求处理函数: def getdevjson(request): print 'get here' if ('key' in request.GET): searchkey = request.GET.get('key') return JsonResponse(search(searchkey)) else: return HttpResponse('Sorry!') 返回字符串中,既可以使用from django.http import JsonRespo

  • Django与AJAX实现网页动态数据显示的示例代码

    前言 这部分已经折腾我两天了,还是没有头绪,可能还会折腾更久,最后在第三天上午解决问题,在一个不起眼的地方被坑了,jQuery加载的问题.会者不难,难者不会,希望后面人少走弯路吧 环境 windows10 pycharm2017.3.3 professional edition python3.6.4 django2.0.2 方法 创建后台读取数据函数,用于后台从数据库读取数据.在views.py文件内增加以下代码 from django.http import JsonResponse def

  • Django动态随机生成温度前端实时动态展示源码示例

    目录 随机生成温度 前端动态实时 一.django APScheduler定时任务 简介 安装 使用步骤 基础组件 二.dwebsocket 简介 安装 使用方法 属性和方法 为了模拟随机的温度显示,在models中的表中的数据 views 路由 VUE中的代码 随机生成温度 前端动态实时 一.django APScheduler定时任务 简介 APScheduler的全称是Advanced Python Scheduler. 它是一个轻量级的 Python 定时任务调度框架. APSchedu

  • JS前端操作 Cookie源码示例解析

    目录 引言 源码分析 使用 源码 分析 set get remove withAttributes & withConverter 总结 引言 前端操作Cookie的场景其实并不多见,Cookie也因为各种问题被逐渐淘汰,但是我们不用Cookie也可以学习一下它的思想,或者通过这次的源码来学习其他的一些知识. 今天带来的是:js-cookie 源码分析 使用 根据README,我们可以看到js-cookie的使用方式: // 设置 Cookies.set('name', 'value'); //

  • jQuery插件之Tocify动态节点目录菜单生成器附源码下载

    Tocify是一个能够动态生成文章节点目录的jQuery插件.假如我们有一篇很长的文章,文章有多个节点,那么使用Tocify可以根据节点元素动态生成文章目录,点击目录可以平滑滚动到对应的节点,当然当滚动页面时,目录结构会根据当前监听到的节点进行切换到当前目录状态. 效果展示         源码下载 Tocify目前支持Twitter Bootstrap和jQueryUI Themeroller两种主题风格,我们可以根据实际项目任选其中一种风格,另外必要条件jQuery 1.7.2+和jQuer

  • jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)

    ImageDrawer.js是一款可以实现动态绘制图片动画的jQuery插件.通过ImageDrawer.js插件,你可以制作在页面中绘制图片的动态过程,你可以控制绘制动画的持续时间等参数,非常有趣. 效果展示       源码下载 使用方法 使用该动态绘制图片插件需要在页面中引入imagedrawer.css,jquery和imagedrawer.js文件. <link rel="stylesheet" href="css/imagedrawer.css"

  • 微前端框架qiankun源码剖析之下篇

    目录 引言 四.沙箱隔离 4.1 JS隔离 1. Snapshot沙箱 2. Legacy沙箱 3. Proxy沙箱 4.2 CSS隔离 1. ShadowDOM 2. Scoped CSS 五.通信方式 六.结语 引言 承接上文  微前端框架qiankun源码剖析之上篇 注意: 受篇幅限制,本文中所粘贴的代码都是经过作者删减梳理后的,只为讲述qiankun框架原理而展示,并非完整源码.如果需要阅读相关源码可以自行打开文中链接. 四.沙箱隔离 在基于single-spa开发的微前端应用中,子应用

  • javascript实现QQ空间相册展示源码

    知识点:html/css布局思维,浮动/定位详解,大企业标准,代码性能优化,js鼠标事件,DOM操作等. 源码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Keywords" content="关键词一,关键词二"> <meta name="De

  • VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

    1. 静态库和动态库 1.1. 静态链接库 举个例子,假如你在编写一个C++工程,根据业务逻辑,这个工程需要用到一些工具类,例如集合操作的工具类(暂且叫他collection_utils),于是你直接定义一个collection_utils.h头文件和一个collection_utils.cpp文件,在头文件中写一些工具函数的定义,在cpp文件中写函数的实现逻辑:如下所示: //---------------collection_utils.h--------------------------

  • React前端开发createElement源码解读

    目录 React 与 Babel 元素标签转译 组件转译 子元素转译 createElement 源码 函数入参 第一段代码 __self 和 __source 第二段代码 props 对象 第三段代码 children 第四段代码 defaultProps 第五段代码 owner ReactElement 源码 REACT_ELEMENT_TYPE 回顾 React 与 Babel 元素标签转译 用过 React 的同学都知道,当我们这样写时: <div id="foo">

  • Java实现身份证号码验证源码示例分享

    整理文档,搜刮出一个Java实现身份证号码验证源码示例代码,稍微整理精简一下做下分享. package xxx; /** * Created by wdj on 2017/6/21. */ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Random; /** * 身份证验证的

  • MyBatis SqlSource源码示例解析

    目录 正文 SqlNode SqlNode接口定义 BoundSql SqlSource SqlSource解析时机 SqlSource调用时机 总结 正文 MyBatis版本:3.5.12. 本篇讲从mybatis的角度分析SqlSource.在xml中sql可能是带?的预处理语句,也可能是带$或者动态标签的动态语句,也可能是这两者的混合语句. SqlSource设计的目标就是封装xml的crud节点,使得mybatis运行过程中可以直接通过SqlSource获取xml节点中解析后的SQL.

随机推荐