首先配置文件链接MySQL数据库
# -*- coding:utf8 -*-
import os
debug = True
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'Lora_Model'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = os.urandom(24)
主文件导包,实例化对象
# -*- coding:utf8 -*-
from flask import Flask, render_template, session, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from flask_login import LoginManager
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo, ValidationError
from datetime import datetime
from Server import config
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
login_manager = LoginManager(app)
创建数据库模型
class User(db.Model):
__tablename__ = "User"
id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
Username = db.Column(db.String(30), nullable=False)
telephone = db.Column(db.String(20), nullable=False)
password = db.Column(db.String(30), nullable=False)
class Device(db.Model):
__tabelname__ = 'Device'
id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
title = db.Column(db.String(10), nullable=False)
value = db.Column(db.String(10), nullable=False)
state = db.Column(db.String(10), nullable=False)
time = db.Column(db.DateTime, default=datetime.now())
创建表单类
class LoginForm(FlaskForm):
Username = StringField(label=u'用户名', validators=[DataRequired(u"用户名不能为空")])
password = PasswordField(label=u'密码', validators=[DataRequired(u"密码不能为空")])
submit = SubmitField(label=u'登录')
class RegisterForm(FlaskForm):
Username = StringField(label=u'用户名', validators=[DataRequired(u"请输入用户名")])
telephone = StringField(label=u'手机号码', validators=[DataRequired(u"请输入手机号码")])
password = PasswordField(label=u'密码', validators=[DataRequired(u"请输入密码")])
PWD = PasswordField(label=u"确认密码", validators=[DataRequired(u"确认密码不能为空"), EqualTo("password", u'两次密码不一致')])
submit = SubmitField(label=u'注册')
def validate_username(self, field):
if User.query.filter_by(Username=field.data).first():
raise ValidationError('用户名已注册,请选用其它名称')
# 自定义邮箱验证器
def validate_address(self, field):
if User.query.filter_by(telephone=field.data).first():
raise ValidationError('该手机号已被使用,请选用其它号码')
首页视图函数
@app.route('/')
def index():
name = session.get("Username", "请先登录")
return render_template('index.html') + "你好 %s" % name
用户登录 ,使用表单验证用户名和密码,在数据库里查找是否与表单里的数据一致,使用重定向函数返回首页,session里保存Username,在上一个视图函数里面添加进去
@app.route('/login/', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
Username = form.Username.data
password = form.password.data
user = User.query.first()
if user:
if Username == user.Username and password == user.password:
print("用户登录" + " " + Username, password)
session['Username'] = Username
return redirect(url_for("index"))
print("用户名或者密码错误,请重新输入!")
else:
print("未知账号")
return render_template('login.html', form=form)
用户退出,就是使用session的pop()方法,将这个Username退出队列
@app.route('/logout/')
def logout():
if LoginForm.Username:
session.pop('Username')
return redirect(url_for('index'))
else:
return render_template('index.html')
下面是用户注册视图,也是使用表单验证器来实现,使用db.session.add()方法添加表单的数据,再调用db.session.commit()提交到数据库
@app.route('/Register/', methods=['GET', 'POST'])
def Register():
form = RegisterForm()
if form.validate_on_submit():
Username = form.Username.data
telephone = form.telephone.data
password = form.password.data
PWD = form.PWD.data
user = User(Username=Username, telephone=telephone, password=password)
db.session.add(user)
db.session.commit()
flash("注册成功!")
print("用户注册" + " " + Username, telephone, password)
session['Username'] = Username
return redirect(url_for("index"))
return render_template('Register.html', form=form)
下面模拟一个温度传感器发送来的数值,通过上面的两个方法保存到数据库,查找数据表中所有的数据,显示在页面上
@app.route('/Device_information/')
def Device_information():
value1 = Device(title='温度模块', value='2°C', state='打开')
db.session.add_all([value1])
db.session.commit()
Device_list = Device.query.all()
print(Device_list)
return render_template('Device_information.html', devices=Device_list)
最后启动脚本别忘啦 if __name__ == '__main__': # db.drop_all() # db.create_all() app.run()
下面就是我们前端部分了
首页index.html
Lora物联网开发平台
Lora物联网开发平台
用户登录
查看数据
申请注册
注销账号
用户登录界面login.html
Lora物联网开发平台
用户登录
注册界面Register.html
Lora物联网开发平台
最后是我们传感器数据显示的页面
Lora物联网开发平台
设备数据信息表
{% for device in devices %}
- 设备名称: {{ device.title}}
- 传感数值: {{ device.value}}
- 设备状态: {{ device.state}}
- 发送时间: {{ device.time}}
- .................................
{% endfor %}