flask简单模拟物联网开发

Flask框架模拟开发

一个物联网后台

首先配置文件链接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物联网开发平台


用户登录

{{ form.csrf_token }}

{% for msg in form.Username.errors %}

{{msg}}

{% endfor %}

{% for msg in form.password.errors %}

{{msg}}

{% endfor %}

注册界面Register.html




    
    Lora物联网开发平台


{{ form.csrf_token }}

{% for msg in form.Username.errors %}

{{msg}}

{% endfor %}

{% for msg in form.telephone.errors %}

{{msg}}

{% endfor %}

{% for msg in form.password.errors %}

{{msg}}

{% endfor %}

{% for msg in form.PWD.errors %}

{{msg}}

{% endfor %}

最后是我们传感器数据显示的页面




    
    Lora物联网开发平台


设备数据信息表

    {% for device in devices %}
  • 设备名称: {{ device.title}}
  • 传感数值: {{ device.value}}
  • 设备状态: {{ device.state}}
  • 发送时间: {{ device.time}}
  • .................................
  • {% endfor %}

 

你可能感兴趣的:(flask简单模拟物联网开发)