websocket是一种持久化的协议,HTTP协议是一种无状态的协议,在特定场合我们需要使用长连接,做数据的实时更新,这种情况下我们就可以使用websocket做持久连接。http与websocket二者存在交集。
后端:from dwebsocket.decorators import accept_websocket
import json
# 存储连接websocket的用户
clist = []
@accept_websocket
def websocketLink(request):
# 获取连接
if request.is_websocket:
# 新增 用户 连接信息
clist.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 sendmsg():
sql = "select * from customer"
res = db1.find_all(sql)
if len(clist)>0:
for i in clist:
i.send(json.dumps({'list': res},ensure_ascii=False).encode('utf-8'))
# websocketMsg(i, {'list': res})
return HttpResponse("ok")
from apscheduler.schedulers.blocking import BlockingScheduler
def getecharts(request):
scheduler = BlockingScheduler()
scheduler.add_job(sendmsg,'interval',seconds=1)
scheduler.start()
return HttpResponse('ok')
前端:
<template>
<div class="bgpic">
<van-row style="padding-top: 10px;padding-bottom: 10px">
<van-col span="8">
<div id="weekmain" style="width: 400px;height: 300px"></div>
</van-col>
<van-col span="8">http://api.map.baidu.com/marker </van-col>
<van-col span="8">
<div id="monthmain" style="width: 400px;height: 300px"></div>
</van-col>
</van-row>
<van-row>
<van-col span="8"></van-col>
<van-col span="8"></van-col>
<van-col span="8">{{infolist1}}</van-col>
</van-row>
</div>
</template>
<script>
import * as echarts from 'echarts';
// import myaxios from "../../../https/myaxios";
import axios from 'axios';
import {reactive} from 'vue';
export default {
name: "myweek",
setup(){
let infolist1 = reactive({"data":[]})
// let mydata = reactive([])
const initdata=()=>{
var socket = new WebSocket("ws:127.0.0.1:8000/websocketLink");
socket.onopen = function () {
console.log('连接成功');//成功连接上Websocket
};
socket.onmessage = function (e) {
// alert('消息提醒: ' + e.data);
//打印服务端返回的数据
infolist1.data = e.data
console.log(e.data)
// mydata = infolist1.list
// console.log(mydata)
};
socket.onclose=function(e){
console.log(e);
socket.close(); //关闭TCP连接
};
}
return{
infolist1,
initdata
}
},
data(){
return{
infolist:[],
}
},
methods:{
mget(){
axios.get("http://127.0.0.1:8000/getecharts").then(res=>{
console.log(res)
})
},
infoshow(){
axios.get("http://localhost:8000/infoshow","get").then(res=>{
this.infolist=res.data.list
this.getmonth()
this.mget()
})
},
getmonth(){
var chartDom = document.getElementById('monthmain');
var myChart = echarts.init(chartDom);
var option;
// prettier-ignore
let dataAxis = [];
// prettier-ignore
let data = [];
for(let i=0;i<this.infolist.length;i++){
dataAxis.push(this.infolist[i]["name"])
data.push(this.infolist[i]["tmoney"])
}
let yMax = 10000;
let dataShadow = [];
for (let i = 0; i < data.length; i++) {
dataShadow.push(yMax);
}
option = {
title: {
text: '特性示例:渐变色 阴影 点击缩放',
subtext: 'Feature Sample: Gradient Color, Shadow, Click Zoom'
},
xAxis: {
data: dataAxis,
axisLabel: {
inside: true,
color: '#fff'
},
axisTick: {
show: false
},
axisLine: {
show: false
},
z: 10
},
yAxis: {
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
color: '#999'
}
},
dataZoom: [
{
type: 'inside'
}
],
series: [
{
type: 'bar',
showBackground: true,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#83bff6' },
{ offset: 0.5, color: '#188df0' },
{ offset: 1, color: '#188df0' }
])
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#2378f7' },
{ offset: 0.7, color: '#2378f7' },
{ offset: 1, color: '#83bff6' }
])
}
},
data: data
}
]
};
// Enable data zoom when user click bar.
const zoomSize = 6;
myChart.on('click', function (params) {
console.log(dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)]);
myChart.dispatchAction({
type: 'dataZoom',
startValue: dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)],
endValue:
dataAxis[Math.min(params.dataIndex + zoomSize / 2, data.length - 1)]
});
});
option && myChart.setOption(option);
},
getweek(){
var chartDom = document.getElementById('weekmain');
var myChart = echarts.init(chartDom);
var option;
option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
name: 'Direct',
type: 'bar',
emphasis: {
focus: 'series'
},
data: [320, 332, 301, 334, 390, 330, 320]
},
{
name: 'Email',
type: 'bar',
stack: 'Ad',
emphasis: {
focus: 'series'
},
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: 'Union Ads',
type: 'bar',
stack: 'Ad',
emphasis: {
focus: 'series'
},
data: [220, 182, 191, 234, 290, 330, 310]
},
{
name: 'Video Ads',
type: 'bar',
stack: 'Ad',
emphasis: {
focus: 'series'
},
data: [150, 232, 201, 154, 190, 330, 410]
},
{
name: 'Search Engine',
type: 'bar',
data: [862, 1018, 964, 1026, 1679, 1600, 1570],
emphasis: {
focus: 'series'
},
markLine: {
lineStyle: {
type: 'dashed'
},
data: [[{ type: 'min' }, { type: 'max' }]]
}
},
{
name: 'Baidu',
type: 'bar',
barWidth: 5,
stack: 'Search Engine',
emphasis: {
focus: 'series'
},
data: [620, 732, 701, 734, 1090, 1130, 1120]
},
{
name: 'Google',
type: 'bar',
stack: 'Search Engine',
emphasis: {
focus: 'series'
},
data: [120, 132, 101, 134, 290, 230, 220]
},
{
name: 'Bing',
type: 'bar',
stack: 'Search Engine',
emphasis: {
focus: 'series'
},
data: [60, 72, 71, 74, 190, 130, 110]
},
{
name: 'Others',
type: 'bar',
stack: 'Search Engine',
emphasis: {
focus: 'series'
},
data: [62, 82, 91, 84, 109, 110, 120]
}
]
};
option && myChart.setOption(option);
},
},
mounted() {
this.infoshow()
this.getweek()
this.initdata()
}
}
</script>
<style scoped>
.bgpic{
background-image: url("../../../https/4.webp");
width: 1269px;
height: 781px;
}
</style>
到此这篇关于django中websocket的具体使用的文章就介绍到这了,更多相关django websocket内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!