Django服务器
出于部分功能实现原因,将上位机更换为Raspberry Pi 3B+,使用了Django服务器。所实现的功能具体参考于此:https://zhuanlan.zhihu.com/p/270196679
本篇文章仅涉及上位机环境的部署,下一篇介绍下位机的使用。
一、Django的部署
最便捷的方式是使用pip安装,具体过程参考官方文档:Django文档
创建一个项目:
django-admin startproject house_sensors
创建多个应用,这里涉及了温度和湿度的传感:
python3 manage.py startapp temp
python3 manage.py startapp humi
创建管理员:
python3 manage.py createsuperuser
修改相应文件(详见文末):
模型文件:models.py
视图文件:views.py
路径文件:urls.py
管理文件:admin.py
安装REST API:
通过pip安装
python3 -m pip install djangorestframework
添加serializers.py文件至humi/(同理加至temp/):
from rest_framework import serializers
from humi.models import Humidity
class HumiSerializer(serializers.ModelSerializer):
class Meta:
model = Humidity
fields = ['captime', 'caphumidity']
安装应用:
在house_sensors/setting.py文件的对应位置中加入
INSTALLED_APPS =[
...
'rest_framework',
'temp',
'humi',
]
激活模型:
python3 manage.py makemigrations temp
python3 manage.py makemigrations humi
python3 manage.py migrate
配置路由:
修改house_sensors/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/', include('temp.urls')),
path('humi/', include('humi.urls')),
]
运行:
python3 manage.py runserver
http://127.0.0.1:8000访问,完成初步部署。
二、Django相关配置
在上文中完成了Django服务器的初步部署,需要进一步完善相应的功能。
1. 自定义服务器地址
在setting.py文件的对应项中加入Raspberry Pi分配到的IP地址:
ALLOWED_HOSTS = ['192.168.XXX.XXX']
运行时则需要指定IP地址以及端口号:
python3 manage.py runserver 192.168.XXX.XXX:[PORT]
2. 修改语言以及时区
继续修改setting.py文件:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
...
USE_TZ = False
False是关闭数据库储存数据时使用的UTC时间,有助于后续Highcharts的使用。
3. Highcharts的使用
相关文档:Highcharts教程
在humi以及temp目录下新建templates文件夹,加入以下文件:
base.html
{% load static %}
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8"><link rel="icon" href="https://jscdn.com.cn/highcharts/images/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
</style>
<script src="https://cdn.highcharts.com.cn/highcharts/highcharts.js"></script>
<script src="https://cdn.highcharts.com.cn/highcharts/modules/exporting.js"></script>
</head>
<body>
{% block content %} {%endblock %}
</body>
</html>
temperature_index.html或者humidity_index.html
{% extends 'base.html' %}
{% load static %}
{% block content %}
<div class="row">
<div class="col-md-12">
<div id="Humidity"></div>
</div>
</div>
<script type="text/javascript">
Highcharts.setOptions({ global: { useUTC: false } });
</script>
<script type="text/javascript">
Highcharts.chart("Humidity", {
chart: {
type: 'spline',
events: {
load: function () {
var series = this.series[0];
setInterval(function (){
$.ajax({
url:'/humi/get_humidity/',
success: function(data) {
var y = data.s1[data.s1.length-1];
series.addPoint([y.time,y.Temperature], true, true);
},
});
},5000); //刷新速度
},
},
},
title: {text: '湿度曲线'},
xAxis: {type: "category",min: 0, max: 75}, //横坐标
yAxis: {title: {text: '湿度'}},
rangeSelector: {
allButtonsEnabled: true,
selected: 2
},
navigator:{
enabled:true
},
scrollbar: {
enabled: true
},
series: [{
name: '湿度',
data: {{res|safe}},
}],
});
</script>
{%endblock %}
三、程序附录
仅就humi应用下的举例:
模型文件models.py
from django.db import models
# Create your models here.
class Humidity(models.Model):
captime=models.DateTimeField(auto_now_add=False)
caphumidity=models.CharField(max_length=10)
def __str__(self):
return self.caphumidity
视图文件views.py:
from django.shortcuts import render
from humi.models import Humidity
from humi.serializers import HumiSerializer
from rest_framework import generics
from django.http import JsonResponse
# Create your views here.
class humidity_api(generics.ListCreateAPIView):
queryset = Humidity.objects.all()
serializer_class = HumiSerializer
def humidity(request):
data = Humidity.objects.all()
res=[]
if data:
for i in data:
tx=i.captime
ty=i.caphumidity
res.append( [tx.isoformat(), float(ty)] )
return render(request, 'humidity_index.html',locals())
def get_humidity(request):
data = Humidity.objects.all()
res=[]
if data:
for i in data:
tx=i.captime
ty=i.caphumidity
res.append( {"time":tx.isoformat(), "Humidity":float(ty) })
return JsonResponse({'s1':res})
路径文件urls.py:
from django.conf.urls import url
from humi import views
urlpatterns = [
url(r'^$', views.humidity,name='humi.humidity'),
url(r'^humidity_api', views.humidity_api.as_view(),name='humi.humidity_api'),
url(r'^get_humidity', views.get_humidity,name='humi.get_humidity'),
]
管理文件admin.py:
from django.contrib import admin
# Register your models here.
from .models import *
class HumidityAdmin(admin.ModelAdmin):
list_display = ('id','captime','caphumidity')
admin.site.register(Humidity,HumidityAdmin)